如何利用C++、C、Python求大小为k的子数组的最小和

97 阅读1分钟

问题

给定一个整数数组和一个数字 *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