力扣643.子数组最大平均数I-C语言实现

题目

给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。
示例:

输入:[1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75

提示:

1 <= k <= n <= 30,000。
所给数据范围 [-10,000,10,000]。

来源:力扣(LeetCode)
链接:子数组最大平均数I
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

力扣在编程模板里给了如下代码:

double findMaxAverage(int* nums, int numsSize, int k){

}

这里可以得出信息:

nums就是整个数组的名字
numsSize就是数组长度大小
k就是要求的子数组的大小

既然他都给出了这些基础定义,下面就按照这个思路去想就好,我也是第一次写这种题目,说实话,我第一反应就是对数组内的区间进行逐元素向后移动即可,中间用total求和,且每次区间求和与maxtotal比较,若是较大就替代,一直执行到最后,在除以k就可以得到最大的average了。

double findMaxAverage(int* nums, int numsSize, int k)
{
    double maxTotal=-300000000,total=0,maxAverage=0;
    for (int j=0;j<=numsSize-k;j++)
    {
        for(int i=0;i<k;i++)
        {
            total+=nums[j+i];
        }
        if(maxTotal<total)maxTotal=total;
        total=0;
    }
    maxAverage=maxTotal/k;
    return maxAverage;
}

这真的是很垃圾啊,一点算法都没用上的程序,自然就是超时,所以对于这里面的代码和逻辑结构进行了思索。
因为是逐个往后进行一个total用法的确就是对于k个值求和的最大来求最大平均值,但是套入两个for里面,程序复杂度就未免太高了。
这就不得不提到滑动窗口了,就是这区间长度是不变的,所以就是随着区间后移,最前面的移除,在区间后面的加入。
力扣官方也给了图示:
力扣643.子数组最大平均数I-C语言实现_第1张图片力扣643.子数组最大平均数I-C语言实现_第2张图片减去左边的加上右边的,这样就不必繁琐得对中间数据求和了。



double findMaxAverage(int* nums, int numsSize, int k) {
    int sum = 0;
    for (int i = 0; i < k; i++) {
        sum += nums[i];
    }
    int maxSum = sum;
    for (int i = k; i < numsSize; i++) {
        sum = sum - nums[i - k] + nums[i];
        if(maxSum<sum)maxSum=sum;
    }
    return (double)(maxSum) / k;
}

优化之后的效果如下
力扣643.子数组最大平均数I-C语言实现_第3张图片不得不提一句啊,这个运行速度和内存消耗真的就离谱,每次运行都不一样。我这个结果就是运行几次里面的最好看的数据(搬上来自然用最好看的数据了)
2021/2/4

你可能感兴趣的:(力扣刷题,c语言,算法)