Мы можем уменьшить эту проблему до самого длинного смежного подмассива с суммой> = 0 путем вычитания k из всех значений в O (n) времени. Теперь давайте посчитаем префикс суммы:
index 0 1 2 3 4 5 6
array 2 -3 3 2 0 -1
prefix 0 2 -1 2 5 5 4
Теперь эта проблема состоит в нахождении двух индексов наиболее далеко друг от друга с prefix_right - prefix_left >= 0
. Давайте создадим новый префикс-индексный массив и отсортируем его по префиксу, а затем по индексам.
index 2 0 1 3 6 4 5
prefix -1 0 2 2 4 5 5
Затем мы можем сделать прямо к левой стреловидности вычислить для каждого префикса, максимальный индекс с префиксом, большим или равным текущему префиксом:
index 2 0 1 3 6 4 5
prefix -1 0 2 2 4 5 5
maxind 6 6 6 6 6 5 5
Теперь, давайте идти вернуться к исходному массиву префикса. Для каждой пары префикс-индекс мы выполняем бинарный поиск в нашем новом массиве, чтобы найти наименьший префикс> = текущий префикс. Мы вычитаем из максимального значения двоичного искомого префикса индекс текущего префикса для получения наилучшей длины последовательности, начиная с текущего индекса. Возьмите последовательность с максимальной длиной.
Этот алгоритм является O (n log n) из-за сортировки и n бинарных поисков.
В вашей первой таблице вы получили префикс '5'. Разве это не должно быть '4' (или значение массива должно быть' 3')? :-D – Groo
Вы правы, я почему-то работал над другим массивом: fixed – jma127
Какова цель бинарных поисков? Разве вам недостаточно просто найти максимум «maxind-index» в вашей третьей таблице? – interjay