0
Ich habe versucht, Code zu erstellen, der die maximale Teilzeichenfolge von Array zählt und Summe und Anfangs- und Endpunkt zurückgibt. Ich habe einen Fehler dort aber, dass ich nicht erkennen kann, zum Beispiel, wenn ich Array(-2, 1, -3, 4, -1, 2, 1, -5, 4)
als Quelle verwende, bekomme ich zurück (7, 5,8)
. Die richtige Antwort sollte jedoch (6, 3, 6)
sein. Code unten.MaxSubArray mit dynamischem Stil
def solve(a: Array[Int]): (Int, Int, Int) = {
require(a.nonEmpty)
val n = a.length
val temp = Array.fill(n)(0, 0, 0)
var max = (0,0,0) // sum, start, end
for (i <- 0 to n-1) {
temp(i) = (a(i), i, i)
}
for (i <- 0 to n-1) {
for (j <- 0 to i) {
if (a(i) > a(j) && temp(i)._1 < temp (j)._1 + a(i)) {
temp(i) = (temp(j)._1 + a(i), j, i)
}
}
}
for (i <- 0 to n-1){
if (max._1 < temp(i)._1){
max = temp(i)
}
}
return max
}
Ist Ihre Lösung nicht mindestens kubisch? –
Ich habe nicht versucht, es zu optimieren, nur um die Lösung direkt funktional auszudrücken. In der Tat ist die obige Lösung von @jwvh dieselbe Komplexität, wir erzeugen beide die gleiche O (n^2) Anzahl von Unterfolgen und summieren jede unabhängig voneinander. Es gibt viele Optimierungspunkte, die Sie hier hinzufügen könnten, aber es hilft, die richtige Antwort zu erhalten. – Iadams
Die richtige Antwort zu erhalten ist absolut trivial. Die richtige Antwort in O (n) Zeit ist, worum es bei diesem Problem geht. O (n^2) ist der Ausgangspunkt, an dem man über die Optimierung nachdenken kann, alles, was schlimmer ist als das könnte auch direkt zu/dev/null gehen. –