Подход :
В качестве общего подхода к проблемам, связанным с подмассивами, вы должны использовать суммы префиксов для добавления каждого подмассива.
Let p
содержат наши суммы префиксов , и пусть nums
будет заданным массивом.
Пусть p[i+1] = nums[0] + nums[1] + ... + nums[i]
(длина p
= длина nums
+ 1).
Тогда каждый подмассив можно записать как p[i-1] - p[i]
. Таким образом, мы можем иметь p[i-1] - p[i] == 0
или нет.
Алгоритм :
Отказ от ответственности: 0 действительно являются подмассивами. Однако, если вы не хотите считать их, вы должны удалить их из входного массива, прежде чем делать следующее. Я не удалил 0.
Создайте массив p
, содержащий префиксных сумм и посчитайте все p[i] == 0
.
Однако имейте в виду, что подсчет c
будет выполнен с учетом наличия c*num
значений p[i] == 0
. Тогда есть sum(c*(c-1)/2)
возможных подмассивов.
Мое решение в Python 3.6+ и может быть использовано в качестве чертежа для вас.
'''
Time Complexity: O(N), where N is the length of nums
Space Complexity: O(N)
'''
from collections import Counter
def zeroSumSub(nums):
if not nums:
return -1
p = [0]
for num in nums:
p.append(p[-1] + num)
count = Counter(p)
return sum(v*(v-1)//2 for v in count.values())
Если вас не устраивает Python:
p[-1]
похоже на p[len(nums)-1]
(таким образом, возвращает последний элемент массива).
Counter
- неупорядоченная коллекция, элементы которой хранятся в виде ключей dict
( суммы префиксов ) и их количество как значение dict
(количество c
). В двух словах, он считает ha sh -табильные объекты.
//
- целочисленное деление.