返回

剑指 Offer II 041. 滑动窗口的平均值C/C++代码解题思路剖析与实现

后端

题目

给定一个整数数组 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 的子数组的平均值。

解题思路

这道题可以用滑动窗口的方法来解决。

  1. 定义一个长度为 k 的窗口,从数组的第一个元素开始向右滑动。
  2. 在每个窗口中,计算窗口内所有元素的和。
  3. 将窗口内所有元素的和除以 k,得到窗口的平均值。
  4. 将窗口的平均值添加到结果数组中。
  5. 重复步骤 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 的窗口。

结语

这道题考察了滑动窗口的思想和实现,以及数组的遍历。