给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。
任何误差小于 10-5 的答案都将被视为正确答案。
示例 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 == nums.length
1 <= k <= n <= 105
-104 <= nums[i] <= 104
题解思路
滑动窗口
这是一道标准的滑动窗口题目
窗口内元素个数为 k,定义左右指针 l, r 差距为k
窗口内元素和为 sum, 窗口内平均数为 sum / k
找最大的平均值,可以转化为找最大的窗口内元素和sum
先求出第一个窗口的sum,然后滑动窗口,每次加上窗口后的元素,减去窗口前的元素
遍历求出最大sum,转成double后 / k 返回即可
Code
滑动窗口
classSolution{publicdoublefindMaxAverage(int[] nums,int k){int len = nums.length;int l =0, r = k -1;// 求出第一个窗口的sumint sum =0;for(int i =0; i < k; i++){
sum += nums[i];}// 滑动窗口,每次加上窗口后的元素,减去窗口前的元素// 遍历求出最大sumint max = sum;while(r < len -1){
sum += nums[++r];
sum -= nums[l++];
max =Math.max(sum, max);}// 用 / 1.0 的方式转换为double,/ k 返回即可return max /1.0/ k;}}