给定大小为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个元素,因此需要花费大量时间。
答案 0 :(得分:3)
从我所看到的,你首先创建一个窗口来计算前K个元素的总和,然后通过减去最左边的值并添加最右边的值来向右移动窗口。
这是复杂性最小的解决方案。
我创建了一个小脚本,演示了正确性以及执行更大输入所需的时间。
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))