[LeetCode]643. Maximum Average Subarray I 解题报告(C++)

本文介绍了解决LeetCode 643题目的两种方法:使用前缀和数组以及滑动窗口法。这两种方法都能有效地找到给定数组中长度为k的连续子数组的最大平均值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[LeetCode]643. Maximum Average Subarray I 解题报告(C++)

题目描述

Given an array consisting of n integers, find the contiguous subarray of given length k that has the maximum average value. And you need to output the maximum average value.

Example 1:

Input: [1,12,-5,-6,50,3], k = 4
Output: 12.75
Explanation: Maximum average is (12-5-6+50)/4 = 51/4 = 12.75

Note:

  1. 1 <= k <= n <= 30,000.
  2. Elements of the given array will be in the range [-10,000, 10,000].

题目大意

  • 给定数组.
  • 找到长度为k的子串.
  • 要求子串的均值最大.返回均值

解题思路

方法1:

  • p[i] 表示 nums[0] + nums[1] + nums[i];
  • 则计算长度为k的子串和就是 p[i]-p[i-k];
  • 遍历i从k->n-1.得到最大的和.
  • 再除以K即可.注意返回的是 double.
代码实现:
class Solution {
public:
    double findMaxAverage(vector<int>& nums, int k) {
        int n = nums.size();
        if (n < k) {
            return 0.0;
        }
        vector<int> p(n, 0);
        p[0] = nums[0];
        // p[i]表示 num[0]+... num[i];
        for (int i = 1; i < n; i++) {
            p[i] =p[i-1]+ nums[i];
        }
        int res = p[k - 1];
        for (int i = k; i < n; i++) {
            int tmp = p[i] - p[i - k];
            res = max(res, tmp);
        }
        return res / (k*1.0);
    }
};

方法2:

  • 维护一个滑动窗口.大小为k.
  • 将窗口向右移动一位,即加上一个右边的数字,减去一个左边的数字
  • 更新res
代码实现:
class Solution {
public:
    double findMaxAverage(vector<int>& nums, int k) {
        int n = nums.size();
        if (n < k) {
            return 0.0;
        }
        int sum = 0;
        for (int i = 0; i < k; ++i) {
            sum += nums[i];
        }
        int res = sum;
        for (int i = k; i < n; i++) {
            sum = sum + nums[i] - nums[i - k];
            res = max(res, sum);
        }
        return res / (k*1.0);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值