Мы можем решить эту проблему в O(logn)
времени, используя разделить & властвуй ака. двоичный поиск. Лучше, чем линейное время. Поэтому нам нужно найти триплет такой, что A[n-1] >= A[n] <= A[n+1]
.
Сначала найдите середину данного массива. Если середина меньше ее левой и больше ее правой. затем верните, вот ваш ответ. Кстати, это было бы базой в вашей рекурсии. Также, если len(arr) < 3
, то тоже возвратитесь. другой базой.
Теперь идут сценарии рекурсии. Когда нужно возвращаться, нам нужно будет проверить дальше. Для этого, если середина больше элемента слева от нее, рассмотрим начало слева от массива как подзадачу и рекурсию с этим новым массивом. т. е. в материальных терминах в этой точке мы имели бы ...2
...
с индексом n
, являющимся 6. Таким образом, мы перемещаемся влево, чтобы увидеть, завершает ли элемент слева от 2
триплет.
В противном случае, если середина больше элемента в правом подмассиве, тогда рассмотрите середину + 1 справа от массива в качестве подзадачи и рекурсии.
Подробнее Теория: выше должно быть достаточно, чтобы понять эту проблему, но читать. Проблема в основном сводится к поиску локальных минимумов в заданном наборе элементов. Число в массиве называется локальным минимумом, если оно меньше его левого и правого чисел, которое точно сводится к A[n-1] >= A[n] <= A[n+1]
.
Данный массив, в котором его первые 2 элемента уменьшаются, а последние 2 элемента увеличиваются, имеют локальные минимумы. Почему это? Докажем это отрицанием. Если первые два числа уменьшаются, а локальных минимумов нет, это означает, что 3-е число меньше 2-го числа. в противном случае вторым номером были бы локальные минимумы. По той же логике 4-й номер должен быть меньше 3-го числа и т. Д. И т. Д. Поэтому числа в массиве должны быть в порядке убывания.Который нарушает ограничение последних двух чисел в порядке возрастания. Это доказывает отрицание того, что должны быть локальные минимумы.
Вышеупомянутая теория предлагает линейный подход O(n)
, но мы определенно можем сделать лучше. Но теория определенно дает нам другую точку зрения на проблему.
Код: Вот питона код (FYI - был набран в текстовом редакторе StackOverflow Freehand, это может 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);
Обратите внимание, что я просто возвращает индекс n
. Чтобы распечатать тройку, просто введите -1
и +1
в возвращаемый индекс. source
Что делать, если это не так, почему вам нужно сделать n^3-решение, это кажется простым в линейном – aaronman
Вы не дали четкого описания того, что вы знаете о вводе. Что такое 'N' в' A [N-1]> = A [N-2] '? Длина последовательности? Любой индекс в некотором диапазоне? – user2357112
Я только понял вопрос, это интересно, но я думаю, вы должны попытаться объяснить это лучше. – aaronman