返回
剑指 Offer II 041. 滑动窗口的平均值C/C++代码解题思路剖析与实现
后端
2024-02-04 21:44:32
题目
给定一个整数数组 nums
和一个整数 k
,返回数组中所有长度为 k
的子数组的平均值。
示例 1:
输入:nums = [1,3,2,6,-1,4,1,8,2], k = 5
输出:[2.2, 2.8, 2.4, 3.6, 2.8]
解释:
子数组 [1,3,2,6,-1] 的平均值 = (1 + 3 + 2 + 6 - 1) / 5 = 2.2
子数组 [3,2,6,-1,4] 的平均值 = (3 + 2 + 6 - 1 + 4) / 5 = 2.8
子数组 [2,6,-1,4,1] 的平均值 = (2 + 6 - 1 + 4 + 1) / 5 = 2.4
子数组 [6,-1,4,1,8] 的平均值 = (6 - 1 + 4 + 1 + 8) / 5 = 3.6
子数组 [-1,4,1,8,2] 的平均值 = (-1 + 4 + 1 + 8 + 2) / 5 = 2.8
示例 2:
输入:nums = [1], k = 3
输出:[1.0]
解释:
数组中只有这一个长度为 3 的子数组。
约束条件:
1 <= nums.length <= 10^5
1 <= k <= nums.length
-10^4 <= nums[i] <= 10^4
题目整理
- 给定一个整数数组
nums
和一个整数k
。 - 求出数组中所有长度为
k
的子数组的平均值。 - 返回一个数组,其中每个元素是长度为
k
的子数组的平均值。
解题思路
这道题可以用滑动窗口的方法来解决。
- 定义一个长度为
k
的窗口,从数组的第一个元素开始向右滑动。 - 在每个窗口中,计算窗口内所有元素的和。
- 将窗口内所有元素的和除以
k
,得到窗口的平均值。 - 将窗口的平均值添加到结果数组中。
- 重复步骤 1-4,直到窗口到达数组的最后一个元素。
C/C++实现
class Solution {
public:
vector<double> getAverages(vector<int>& nums, int k) {
vector<double> result;
int n = nums.size();
if (k > n) {
return result;
}
long long sum = 0;
for (int i = 0; i < k; i++) {
sum += nums[i];
}
result.push_back((double)sum / k);
for (int i = k; i < n; i++) {
sum -= nums[i - k];
sum += nums[i];
result.push_back((double)sum / k);
}
return result;
}
};
复杂度分析
- 时间复杂度:O(n),其中 n 是数组
nums
的长度。 - 空间复杂度:O(1),因为我们只需要存储一个长度为
k
的窗口。
结语
这道题考察了滑动窗口的思想和实现,以及数组的遍历。