Трюк, который вам нужен для этого, состоит в том, чтобы создать массив кумулятивных сумм, так что sums[i] = sum of all arr[0] through arr[i]
.
Конечно, если sums[i] == 0
, то (0,i)
является одной из пар, которые вы ' ищите, и вы должны посчитать это.
Для всех остальных, обратите внимание, что если сумма arr[i] though arr[j]
равна нулю, то sums[i-1] == sums[j]
.
Так что вам просто нужно знать, сколько совпадающих пар значений есть в sums
.
Составить карту ха sh из значения-> число, которое дает частоту каждого значения в sums
. Затем для каждого счета m
, который по крайней мере 2, у вас есть m*(m-1)/2
пар.