题目描述
给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。
任何误差小于 10-5 的答案都将被视为正确答案。
示例
示例 1
bash
输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
示例 2
bash
输入: nums = [5], k = 1
输出: 5.00000000000000
题解
这个问题可以通过滑动窗口的方法来解决。
- 初始化窗口:首先,我们计算数组中第一个长度为 k 的子数组的和。
- 滑动窗口:然后,我们滑动窗口遍历整个数组,对于每个新的窗口,我们减去窗口左侧的元素,加上窗口右侧的元素,以计算新的窗口和。
- 更新最大平均值:对于每个窗口,我们计算平均值,并更新最大平均值。
- 返回结果:遍历结束后,返回计算出的最大平均值。
代码实现
cpp
double findMaxAverage(vector<int>& nums, int k) {
double maxAverage = nums[0];
int windowSum = 0;
// 初始化窗口和
for (int i = 0; i < k; ++i) {
windowSum += nums[i];
}
maxAverage = (windowSum * 1.0) / k;
// 滑动窗口
for (int i = k; i < nums.size(); ++i) {
windowSum = windowSum - nums[i - k] + nums[i];
double windowSumAverage = (windowSum * 1.0) / k;
maxAverage = max(maxAverage, windowSumAverage);
}
return maxAverage;
}
复杂度分析
● 时间复杂度:O(n),其中 n 是数组 nums 的长度。我们只需要遍历一次数组。
● 空间复杂度:O(1),因为我们只使用了常数个额外变量。
这个算法通过使用滑动窗口来高效地计算每个连续子数组的和,从而找到平均值最大的 k 个连续的子数组。