tun wir dies in O(logn)
Zeit lösen können aka divide & erobern werden. binäre Suche. Besser als lineare Zeit. Also müssen wir ein Triplett finden, so dass A[n-1] >= A[n] <= A[n+1]
.
Zuerst finden Sie die Mitte des angegebenen Arrays. Wenn Mitte kleiner als links und größer als rechts ist. Dann komm zurück, das ist deine Antwort. Übrigens wäre dies ein Grundfall in Ihrer Rekursion. Auch wenn len(arr) < 3
dann auch zurückkommt. ein anderer Basecase.
Jetzt kommt die Rekursion Szenarien. Um zu rekrutieren, müssten wir weiter rechts inspizieren. Falls if mid größer als das Element auf der linken Seite ist, sollten Sie daher davon ausgehen, dass Sie als Teilproblem links vom Array beginnen und mit diesem neuen Array rekursiv arbeiten. das heißt in greifbare Begriffe an dieser Stelle würden wir ...2
...
mit Index n
wird 6. Also nach links bewegen wir sehen, ob das Element links von 2
das Triplett abgeschlossen ist.
Andernfalls, wenn mid größer ist als das Element auf seinem rechten Subarray, dann betrachten Sie mid + 1 nach rechts des Arrays als ein Teilproblem und recurse.
Mehr Theorie: Die oben sollte ausreichend sein, um das Problem zu verstehen, aber lesen Sie weiter. Das Problem besteht im Wesentlichen darin, lokale Minima in einer gegebenen Menge von Elementen zu finden. Eine Zahl im Array heißt lokale Minima, wenn sie kleiner als ihre linke und rechte Zahl ist, was genau auf A[n-1] >= A[n] <= A[n+1]
hinausläuft.
Ein gegebenes Array, so dass seine ersten 2 Elemente abnehmen und die letzten 2 Elemente ein lokales Minimum haben. Warum das? Lasst uns dies durch Verneinung beweisen. Wenn die ersten beiden Zahlen abnehmen und keine lokalen Minima vorhanden sind, bedeutet dies, dass die dritte Zahl kleiner als die zweite Zahl ist. andernfalls wäre die zweite Zahl lokale Minima gewesen. Nach der gleichen Logik muss die 4. Nummer kleiner als die 3. Nummer sein und so weiter und so fort. Also müssen die Zahlen im Array in absteigender Reihenfolge sein.Die verletzt die Beschränkung der letzten zwei Zahlen in aufsteigender Reihenfolge. Dies beweist durch die Negation, dass es ein lokales Minimum geben muss.
Die obige Theorie schlägt einen linearen Ansatz O(n)
vor, aber wir können definitiv besser machen. Aber die Theorie gibt uns definitiv eine andere Perspektive auf das Problem.
Code: Hier Python-Code (FYI - wurde in Stackoverflow Texteditor freihändig eingegeben haben, es könnte misbheave).
def local_minima(arr, start, end):
mid = (start+end)/2
if mid-2 < 0 and mid+1 >= len(arr):
return -1;
if arr[mid-2] > arr[mid-1] and arr[mid-1] < arr[mid]: #found it!
return mid-1;
if arr[mid-1] > arr[mid-2]:
return local_minima(arr, start, mid);
else:
return local_minima(arr, mid, end);
Bitte beachte, dass ich den Index des n
gerade zurück. Um das Triple auszudrucken, tun Sie einfach -1
und +1
zum zurückgegebenen Index. source
Was ist, wenn es nicht einen gibt, warum sollten Sie auch eine n^3 Lösung machen? Dies scheint einfach in linear zu sein – aaronman
Sie haben keine klare Beschreibung dessen gegeben, was Sie über die Eingabe wissen. Was ist 'N' in' A [N-1]> = A [N-2] '? Die Länge der Sequenz? Irgendein Index in einem Bereich? – user2357112
Ich habe gerade die Frage verstanden, es ist interessant, aber ich denke, Sie sollten versuchen, es besser zu erklären – aaronman