前言
二月份的快乐简单题!
提示:以下是本篇文章正文内容,下面代码可供参考
一、题目の描述
给定 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]。
二、分析及代码
- 维护一个长度为 k 的滑动窗口。当滑动窗口从下标范围[ i , i + k - 1 ] 移动到下标范围 [ i + 1 , i + k ]时,nums[ i ]从窗口中移出,nums[ i + k ]进入到窗口内;
- 利用上述关系,可以在 O(1) 的时间内通过 sum-nums[ i ] + nums[ i + k ]计算出下一个滑动窗口的子数组元素和;
- 第一个子数组的元素和需要通过计算 nums 的前 k 个元素之和得到,利用上述关系可以快速计算出其他子数组的元素和;
- 只需要遍历数组 nums 一次即可得到每个长度为 k 的子数组的元素和,时间复杂度是 O(n);
- 利用最大的子数组元素和计算出最大平均数。
代码如下(示例):
double findMaxAverage(int* nums, int numsSize, int k){
double sum = 0,maxSum = 0;
for(int i = 0; i < k;i++){
sum += nums[i];
}
maxSum =sum;//计算前k个元素之和
for(int i = 0;i + k < numsSize;i++){
sum = sum + nums[i + k] - nums[i];//滑动窗口向后滑动
maxSum = fmax(maxSum,sum);//更新最大子数组和
}
return maxSum / k;//计算平均数
三、总结
方法和思路都挺简单的一道题,边界条件考虑仔细就不会有问题。