Php 解密序列-找到整数的连续序列数,使其和为零

Php 解密序列-找到整数的连续序列数,使其和为零,php,algorithm,performance,sequences,Php,Algorithm,Performance,Sequences,下面是一个编程任务 给你一个N个整数的序列。任务是找到整数的连续序列的数量,使它们的和为零 例如,如果序列为: 2, -2, 6, -6, 8 有3个这样的序列: 2,-2 2,-2,5,6,-6,-5 6,-6 5,6,-6,-5 “2,-2” “6,-6” “2,-2,6,-6” 我已经有了以下用PHP编写的程序,可以从STDIN读取输入(第一行包含后面的整数数) 这对于较小的序列很有效,但其效率为O(n^2) 对于一个包含100.000个整数的序列,哪种算法是合适的(可能是O(n)效

下面是一个编程任务

给你一个N个整数的序列。任务是找到整数的连续序列的数量,使它们的和为零

例如,如果序列为: 2, -2, 6, -6, 8 有3个这样的序列:

2,-2
2,-2,5,6,-6,-5
6,-6
5,6,-6,-5
  • “2,-2”
  • “6,-6”
  • “2,-2,6,-6”
我已经有了以下用PHP编写的程序,可以从
STDIN
读取输入(第一行包含后面的整数数)

这对于较小的序列很有效,但其效率为O(n^2)


对于一个包含100.000个整数的序列,哪种算法是合适的(可能是O(n)效率?

让我们假设您的数据存储在一个数组中,让它成为
arr
。 创建一个数组
sum
,以便:

sum[i] = arr[0] + arr[1] + ... + arr[i]
此外,还有一个以0开头的单个条目(用于处理从开头开始并求和为零的子阵列)


现在,很容易看出,对于每两个指数
i,j
,因此
i由于我无法回复评论,这是对amit答案的回复。
也许我有点错误,但是当将您的方法应用于原始测试用例时,我们没有得到正确的答案:

input = [2, -2, 6, -6, 8]
sum = [2, 0, 6, 0, 8]
sorted(sum) = [0, 0, 2, 6, 8]
因为数字0有两个重复项,所以我们得到(2*1)/2=1,这是不正确的(正确答案是3)。
我错过了什么?谢谢

谢谢。抱歉,回复太晚。要完成此操作,您必须在和数组中添加额外的条目,并使用零,因此:arr=[1,2,-2,5,6,-6,-5,8]和=[0,1,3,1,6,12,6,1,9]排序(和)=[0,1,1,1,1,3,6,6,9,12]这将解决某些情况下的问题,其中第一项是零序的一部分
arr = [1,2,-2,5,6,-6,-5,8]
sum = [0,1,3,1,6,12,6,1,9]
sorted(sum) = [0,1,1,1,3,6,6,9,12]
Choose(3,2) + Choose(2,2) = 3*2/2 + 2/2 = 3+1 = 4
2,-2
2,-2,5,6,-6,-5
6,-6
5,6,-6,-5
input = [2, -2, 6, -6, 8]
sum = [2, 0, 6, 0, 8]
sorted(sum) = [0, 0, 2, 6, 8]