Ссылка в текущем принятом ответе требует регистрации для членства, а я не делаю ее содержание.
Этот алгоритм найдет все подмассивы с суммой 0, и его легкоизменен, чтобы найти минимальный или отслеживать начальный и конечный индексы.Этот алгоритм имеет вид O (n) .
. Учитывая массив int[] input
, вы можете создать массив int[] tmp
, где tmp[i] = tmp[i - 1] + input[i];
Каждый элемент tmp будет хранить сумму входных данных.до этого элемента (префиксная сумма массива).
Теперь, если вы проверите tmp, вы заметите, что могут быть значения, которые равны друг другу.Допустим, что эти значения имеют индексы j an k with j < k
, тогда сумма входных данных до j
равна сумме до k
, а это означает, что сумма части массива между j
и k
равно 0!В частности, подмассив 0 sum будет иметь индекс от j + 1 до k.
- ПРИМЕЧАНИЕ: если
j + 1 == k
, то k is 0
и все!;) - ПРИМЕЧАНИЕ. Алгоритм должен учитывать виртуальный
tmp[-1] = 0
; - ПРИМЕЧАНИЕ. Пустой массив имеет сумму 0 и минимален, и этот особый случай также должен быть затронут в интервью.,Тогда интервьюер скажет, что это не считается, но это еще одна проблема!;)
Реализация может быть реализована различными способами, включая использование HashMap с парами, но будьте осторожны со специальным случаем в разделе NOTE выше.
Пример:
int[] input = {4, 6, 3, -9, -5, 1, 3, 0, 2}
int[] tmp = {4, 10, 13, 4, -1, 0, 3, 3, 5}
- Значение 4 в tmp по индексу 0 и 3 ==> сумма tmp 1 до 3 = 0, длина (3 - 1) + 1 = 3
- Значение 0 в tmp по индексу5 ==> сумма tmp от 0 до 5 = 0, длина (5 - 0) + 1 = 6
- значение 3 в tmp для индекса 6 и 7 ==> сумма tmp от 7 до 7 = 0, длина (7 - 7) + 1 = 1
**** ОБНОВЛЕНИЕ ****
Предполагая, что в нашем массиве tmp мы получим несколько элементов с одинаковым значением, тогда выдолжны рассмотреть каждую идентичную пару в этом!Пример (имейте в виду, что виртуальный «0» в индексе «-1»):
int[] array = {0, 1, -1, 0}
int[] tmp = {0, 1, 0, 0}
При применении того же алгоритма, который описан выше, подмассивы с нулевой суммой ограничиваются следующими индексами (включены):
[0] [0-2] [0-3] [1-2] [1-3] [3]
Хотя наличие нескольких записей с одним и тем же значением может повлиять на сложность алгоритма в зависимости от реализации, я полагаю, что при использовании инвертированного индекса в tmp (отображение значенияк индексам, где он появляется) мы можем сохранить время выполнения на O (n).