Możemy rozwiązać ten problem w czasie korzystania O(logn)
podzielić & przejęcie aka. wyszukiwanie binarne. Lepsze niż czas liniowy. Więc musimy znaleźć trójkę tak, że A[n-1] >= A[n] <= A[n+1]
.
Najpierw znajdź środek danej tablicy. Jeśli połowa jest mniejsza od lewej i większa od prawej. następnie wróć, to twoja odpowiedź. Nawiasem mówiąc, byłaby to baza w rekursji. Także jeśli len(arr) < 3
to też wróć. inna podstawa.
Teraz przychodzi scenariusz rekursji. Kiedy powracać, będziemy musieli dokonać dokładnej inspekcji. W tym przypadku, jeśli mid jest większy niż element po lewej stronie, rozważ początek od lewej tablicy jako podproblem i recurse z tą nową tablicą. tj. w warunkach namacalnych w tym momencie, mielibyśmy ...2
z indeksem n
będącym 6. Więc przesuwamy się w lewo, aby zobaczyć, czy element po lewej stronie 2
kończy triplet.
W przeciwnym razie, jeśli środek jest większy niż element na prawej pod-planszy, należy rozważyć środek + 1 na prawo macierzy jako subproblem i rekurencję.
Więcej Teoria: Powyższy powinny być wystarczające, aby zrozumieć problem, ale czytaj dalej. Problem zasadniczo sprowadza się do znalezienia lokalnych minimów w danym zestawie elementów. Liczba w tablicy nazywana jest lokalnymi minima, jeśli jest mniejsza niż jej lewy i prawy numer, który precyzyjnie sprowadza się do A[n-1] >= A[n] <= A[n+1]
.
Dana tablica tak, że jej pierwsze 2 elementy zmniejszają się, a ostatnie 2 elementy mają coraz więcej MAJĄ minimalne lokalne. Dlaczego? Pozwala to udowodnić to przez negację. Jeśli pierwsze dwie liczby maleją, a nie ma lokalnych minimów, oznacza to, że trzecia liczba jest mniejsza od drugiej liczby. w przeciwnym razie druga liczba byłaby lokalnymi minimami. Zgodnie z tą samą logiką czwarta liczba będzie musiała być mniejsza niż trzecia i tak dalej. Więc liczby w tablicy będą musiały być malejące.Co narusza ograniczenie dwóch ostatnich liczb będących w porządku rosnącym. Dowodzi to przez zaprzeczenie, że muszą istnieć lokalne minimalne wartości.
Powyższa teoria sugeruje podejście liniowe O(n)
, ale zdecydowanie możemy zrobić lepiej. Ale teoria zdecydowanie daje nam inną perspektywę dotyczącą problemu.
Kod: Oto kod python (FYI - został wpisany w stackoverflow edytora tekstu odręczne, może 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);
Pamiętaj, że właśnie zwróciłem indeks n
. Aby wydrukować potrójny, po prostu wykonaj -1
i +1
do zwróconego indeksu. source
Co zrobić, jeśli nie ma, i dlaczego trzeba zrobić rozwiązanie n^3, wydaje się to łatwe do wykonania w liniowym – aaronman
Nie podałeś jasnego opisu tego, co wiesz o danych wejściowych. Co to jest 'N' w' A [N-1]> = A [N-2] '? Długość sekwencji? Dowolny indeks w pewnym zakresie? – user2357112
Po prostu zrozumiałem pytanie, jest interesujące, ale myślę, że powinieneś spróbować wyjaśnić to lepiej – aaronman