问题
给定一个整数数组和一个数字 *k*,求大小为k的子数组的最小和。 *k*.
蛮力方法
一个简单的解决方案是构建所有大小为 k的子数 ,计算它们的和,并最终返回数值最小的和。这个解决方案的时间复杂度为O(N*k)。让我们再看看一种方法。
高效的方法
一个更有效的解决方法是基于这样的事实:大小的子数的总和 *k* 可以在O(1) ,利用前面的子数组的大小之和来实现。 *k*.除了第一个子数之外,总和的计算方法是删除前一个子数的第一个元素,并将下一个元素加入到新的子数中,并不断更新结果。这种方法需要O(N)时间和O(1)辅助空间。
C++编程
#include <iostream>
using namespace std;
int minSum(int arr[], int n, int k)
{
// Compute sum of first subarray of size k
int ans = 0;
for (int i=0; i<k; i++)
ans += arr[i];
// Compute sums of remaining subarrays by
// removing first element of previous
// subarray and adding last element of
// current subarray.
int sum = ans;
for (int i=k; i<n; i++)
{
sum += arr[i] - arr[i-k];
ans = min(ans, sum);
}
return ans;
}
int main(){
int arr[]={1, 2, 4, 5};
int n = sizeof(arr)/sizeof(arr[0]);
int k = 2;
cout<<minSum(arr, n, k);
}
输出
3
Python编程
def minSum(arr, n, k):
# Compute sum of first
# subarray of size k
ans = 0
for i in range(k):
ans += arr[i]
# Compute sums of remaining subarrays by
# removing first element of previous
# subarray and adding last element of
# current subarray.
sum = ans
for i in range(k, n):
sum += arr[i] - arr[i-k]
ans = min(ans, sum)
return ans
l = [1, 2, 3, 4]
n=len(l)
k=2
print(minSum(l, n, k))
输出
3
C语言编程
#include <stdio.h>
int min(int a, int b){
return a>=b?b:a;
}
int minSum(int arr[], int n, int k)
{
// Compute sum of first subarray of size k
int ans = 0;
for (int i=0; i<k; i++)
ans += arr[i];
// Compute sums of remaining subarrays by
// removing first element of previous
// subarray and adding last element of
// current subarray.
int sum = ans;
for (int i=k; i<n; i++)
{
sum += arr[i] - arr[i-k];
ans = min(ans, sum);
}
return ans;
}
int main(){
int arr[]={1, 2, 4, 5};
int n = sizeof(arr)/sizeof(arr[0]);
int k = 2;
printf("%d", minSum(arr, n, k));
}
输出
3