给定 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]。
解题思路:
这是一道滑动窗口的简单题,既然用到滑动窗口,那么双重for循环解决问题显然不现实(果然会超时),所以还是得按照滑动窗口的思路来,先计算第一个窗口的和,保存下来,接着向下移动的过程,相当于减去之前的窗口第一个值再加上新移动位置的值,保存下来最大的和,最后计算平均数,代码如下:
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
int sum = 0;
// 先计算第一个窗口的和
for(int i = 0; i < k; i ++) {
sum += nums[i];
}
double maxAvg = sum;
// 每次移动窗口
for(int i = k; i < nums.size(); i ++) {
// 更新窗口内的总和
sum = sum + nums[i] - nums[i - k];
double avg = sum * 1.0;
maxAvg = maxAvg > avg ? maxAvg : avg;
}
return maxAvg / k;
}
};
/*作者:heroding
链接:https://leetcode-cn.com/problems/maximum-average-subarray-i/solution/cji-bai-shuang-99-by-heroding-wolo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/
下面是一开始我写错的代码,用了双重for循环,果然超时了。。。
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
double max = INT_MIN;
for(int i = 0; i <= nums.size() - k; i ++) {
double avg = 0;
for(int j = i; j < i + k; j ++) {
avg += nums[j];
}
avg /= k;
max = max > avg ? max : avg;
}
return max;
}
};
/*作者:heroding
链接:https://leetcode-cn.com/problems/maximum-average-subarray-i/solution/cji-bai-shuang-99-by-heroding-wolo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/