【C++刷题】力扣-#643-子数组最大平均数I

题目描述

给你一个由 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

题解

这个问题可以通过滑动窗口的方法来解决。

  1. 初始化窗口:首先,我们计算数组中第一个长度为 k 的子数组的和。
  2. 滑动窗口:然后,我们滑动窗口遍历整个数组,对于每个新的窗口,我们减去窗口左侧的元素,加上窗口右侧的元素,以计算新的窗口和。
  3. 更新最大平均值:对于每个窗口,我们计算平均值,并更新最大平均值。
  4. 返回结果:遍历结束后,返回计算出的最大平均值。

代码实现

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 个连续的子数组。

相关推荐
Ronin3054 分钟前
虚拟机数据管理模块
开发语言·c++·rabbitmq
熬了夜的程序员5 分钟前
【LeetCode】117. 填充每个节点的下一个右侧节点指针 II
java·算法·leetcode
3GPP仿真实验室5 分钟前
【Matlab源码】6G候选波形:MIMO-OFDM-IM 增强仿真平台
开发语言·网络·matlab
晓131315 分钟前
第五章 【若依框架:优化】高级特性与性能优化
java·开发语言·性能优化·若依
一叶之秋141218 分钟前
基石之力:掌握 C++ 继承的核心奥秘
开发语言·c++·算法
见牛羊19 分钟前
CMakeLists 写法总结3.0
开发语言·c++
柒儿吖20 分钟前
rudp Reliable UDP 库在 OpenHarmony 的 lycium 适配与 CRC32 测试
c++·c#·openharmony
大模型玩家七七20 分钟前
效果评估:如何判断一个祝福 AI 是否“走心”
android·java·开发语言·网络·人工智能·batch
拾光Ծ21 分钟前
【优选算法】滑动窗口算法:专题一
c++·算法·滑动窗口·c++算法·滑动窗口算法·笔试面试
im_AMBER26 分钟前
Leetcode 118 从中序与后序遍历序列构造二叉树 | 二叉树的最大深度
数据结构·学习·算法·leetcode