给定一个正整数数组,找到长度为L的连续子序列的总和等于S

时间:2019-01-15 08:31:39

标签: arrays algorithm data-structures

给定一个正整数数组,其值在[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)。

1 个答案:

答案 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);
        }
    }