Разобрать решение из комментария. Сначала создайте генератор для получения всех подмассивов:
def gen_subarrays(arr):
for i in range(len(arr)):
for j in range(i+1, len(arr)+1):
yield arr[i:j]
, затем функцию для получения всех массивов с нулевой суммой:
def find_zero_sums(sarrays):
for sa in sarrays:
if sum(sa) == 0:
yield sa
, а затем функцию для отслеживания самый длинный:
def longest_zero_sum(arr):
longest = []
for zs in find_zero_sums(gen_subarrays(arr)):
if len(zs) > len(longest):
longest = zs
return longest
вывод:
print(longest_zero_sum([15, -2, 2, -8, 1, 7, 10, 23]))
print(longest_zero_sum([1,2,3]))
print(longest_zero_sum([8, -8, 7, -7, 15, -15]))
print(longest_zero_sum([10, -10, 12, -12, 13, -13]))
print(longest_zero_sum([1,3,0,4,5]))
is
[-2, 2, -8, 1, 7]
[]
[8, -8, 7, -7, 15, -15]
[10, -10, 12, -12, 13, -13]
[0]
Вы можете получить более эффективное решение, если отсортируете индексы подмассива по убыванию длины . Тогда первый подмассив, который вы обнаружите, что сумма к нулю является самым длинным:
def gen_subarrays(arr):
indices = [(i,j) for i in range(len(arr)) for j in range(i+1, len(arr)+1)]
indices.sort(key=lambda (i,j): i-j) # sort on length (-(j-i))
for i, j in indices:
yield arr[i:j]
def longest_zero_sum(arr):
for sa in gen_subarrays(arr):
if sum(sa) == 0:
return sa
return []
результат такой же, как и выше.