【LeetCode每日一题】——643.子数组最大平均数I

一【题目类别】

  • 滑动窗口

二【题目难度】

  • 简单

三【题目编号】

  • 643.子数组最大平均数I

四【题目描述】

  • 给你一个由 n n n 个元素组成的整数数组 n u m s nums nums 和一个整数 k k k
  • 请你找出平均数最大且 长度为 k k k 的连续子数组,并输出该最大平均数。
  • 任何误差小于 1 0 − 5 10^{-5} 105 的答案都将被视为正确答案。

五【题目示例】

  • 示例 1:

    • 输入:nums = [1,12,-5,-6,50,3], k = 4
    • 输出:12.75
    • 解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
  • 示例 2:

    • 输入:nums = [5], k = 1
    • 输出:5.00000

六【题目提示】

  • n = = n u m s . l e n g t h n == nums.length n==nums.length
  • 1 < = k < = n < = 1 0 5 1 <= k <= n <= 10^{5} 1<=k<=n<=105
  • − 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^{4} <= nums[i] <= 10^{4} 104<=nums[i]<=104

七【解题思路】

  • 利用滑动窗口的思想
  • 首先计算前k个元素值的和
  • 然后进入循环遍历剩下的元素,每遍历到一个元素时,减去“窗口”中第一个元素,然后将新遍历到的元素加入“窗口”中,之后进行比较,取最大值
  • 题目要求我们返回duoble类型,所以最后需要进行强制类型转换,用最大“窗口”的和除以窗口元素个数
  • 最后返回结果即可

八【时间频度】

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n为传入的数组的长度
  • 空间复杂度: O ( 1 ) O(1) O(1)

九【代码实现】

  1. Java语言版
class Solution {
    
    
    public double findMaxAverage(int[] nums, int k) {
    
    
        int tempMax = 0;
        for(int i = 0;i<k;i++){
    
    
            tempMax += nums[i];
        }
        int sum = tempMax;
        for(int i = k;i<nums.length;i++){
    
    
            sum = sum - nums[i - k] + nums[i];
            tempMax = Math.max(tempMax,sum);
        }
        return (double)tempMax / k;
    }
}
  1. C语言版
double findMaxAverage(int* nums, int numsSize, int k)
{
    
    
    int tempSum = 0;
    for(int i = 0;i<k;i++)
    {
    
    
        tempSum += nums[i];
    }
    int sum = tempSum;
    for(int i = k;i<numsSize;i++)
    {
    
    
        sum = sum - nums[i - k] + nums[i];
        tempSum = fmax(tempSum,sum);
    }
    return (double)tempSum / k;
}
  1. Python语言版
class Solution:
    def findMaxAverage(self, nums: List[int], k: int) -> float:
        tempSum = resSum = sum(nums[:k])
        for i in range(k,len(nums)):
            tempSum = tempSum - nums[i - k] + nums[i]
            resSum = max(resSum,tempSum)
        return resSum / k
  1. C++语言版
class Solution {
    
    
public:
    double findMaxAverage(vector<int>& nums, int k) {
    
    
        int tempSum = 0;
        for(int i = 0;i<k;i++)
        {
    
    
            tempSum += nums[i];
        }
        int sum = tempSum;
        for(int i = k;i<nums.size();i++)
        {
    
    
            sum = sum - nums[i - k] + nums[i];
            tempSum = max(tempSum,sum);
        }
        return (double)tempSum / k;
    }
};

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  3. Python语言版
    在这里插入图片描述

  4. C++语言版
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/IronmanJay/article/details/129893456