查找数组中K顺序项的最小总和

时间:2015-08-14 08:16:30

标签: arrays algorithm sum

给定大小为n和子数组大小为k的无序数组,找出所有连续子数组总和的最小总和。

我们将有(n-(k-1))个子阵列

示例:

阵列(n = 5):5 3 0 2 5

k = 3

子阵列:5 3 0,3 0 2,0 2 5

总和:8,5,7

最低金额:5

我的代码:

sum = 0;

    for(index=0; index<K; index++){

        sum = sum + array[index];
    }

    minSum = sum;

    if(N!=K){
        for(index=1; index<=(N-H); index++){

            sum = sum - array[index-1] + array[index+K-1];

            if(sum < minSum){
                minSum = sum;
            }
        }   
    }

    cout << minSum << endl; 

我的问题是:

有没有有效的代码可以做到这一点? 由于Array具有10 ^ 5个元素,因此需要花费大量时间。

1 个答案:

答案 0 :(得分:3)

从我所看到的,你首先创建一个窗口来计算前K个元素的总和,然后通过减去最左边的值并添加最右边的值来向右移动窗口。

这是复杂性最小的解决方案。

我创建了一个小脚本,演示了正确性以及执行更大输入所需的时间。

http://ideone.com/pS7Sp5

array = (5,3,0,2,5)
K = 3
N = len(array)


def findMin(array, sub_array_size):
    sum = 0;

    for index in range(K):
        sum = sum + array[index];

    minSum = sum;

    if N != K:
        for index in range(1,(N-K)+1):
            sum = sum - array[index-1] + array[index+K-1];

            if(sum < minSum):
                minSum = sum
    return minSum

print(findMin(array,3))
print(findMin([1,0]*100000,3))