给定一个正整数数组,其值在[1,8]中,我想找到长度为L的连续子序列的起始索引,它们的和等于S。此查询可以表示为Q
A: [3, 2, 3, 1, 2, 1, 3, 1, 1, 6, 3, 3, 3, 2, 3, 1, 1, 3]
Q< 3, 5 > : [5, 6, 14, 15] ;
Starting at index 5: {1, 3, 1},
Starting at index 6: {3, 1, 1},
Starting at index 14: {3, 1, 1},
Starting at index 15: {1, 1, 3}
Q< 4, 9 > : [0, 12] ;
Starting at index 0: {3, 2, 3, 1},
Starting at index 12: {3, 2, 3, 1}
查询结果可以在O(n)时间内轻松计算。有什么办法可以通过预处理数组在O(1)或O(log n)的时间内找到这些索引?预处理数组的数据结构的空间复杂度最好不超过O(n)。
答案 0 :(得分:1)
您可以构建一个求和数组来查找O(n)时间中L个连续元素的和。
A: [3,2,3,1,2,1,3,1]
S: [3,5,8,9,11,12,15,16]
现在对于A中的每个元素i,都可以通过S [i + L] -S [i]求和。总体复杂度为O(n)。
int n = 9;
int a[] = {0,3,2,3,1,2,1,3,1};
int l = 3;
int sum = 5;
int s[] = new int[n];
s[0] = a[0];
for(int i=1;i<n;i++)
{
s[i] = a[i]+s[i-1];
}
for(int i=0;i<n-l;i++)
{
int cur = s[i+l]-s[i];
if(cur == sum)
{
System.out.println(cur);
}
}