【leetcode17-----子数组最大平均数】
1.题目描述
给你一个由 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
2.题目链接
3.思路讲解
笔者最开始解这道题的时候使用的是暴力解法,结果最后超过了时间限度,然后又对算法进行了优化,要找出平均数最大的长度为 k 的连续子数组,那么只需找出总和最大的长度为 k 的连续子数组,首先计算前k个数的和作为初始值,也作为最大值,然后从第k个数开始向后移动,每次移动子数组和的变化是加上当前元素的值,减去当前元素的k个元素之前的值,每次移动子数组就是进去一个数出去一个数。每次移动都比较一下当前总和与最大值的大小,若大于最大值,则最大值就等于当前总和,最后即可找出具有最大总和的长度为 k 的连续子数组,然后除以k,就得到平均数。
4.模板代码
class Solution { public double findMaxAverage(int[] nums, int k) { double ave; int sum=0; //首先计算前k个数的总和作为初始值 for(int i=0;i<k;i++){ sum+=nums[i]; } int max=sum;//也作为最大值 for(int i=k;i<nums.length;i++){ sum=sum+nums[i]-nums[i-k];//每次移动总和就等于加上当前元素,减去当前元素的k个数之前的元素 if(sum>max){//与最大值比较,若比最大值大,则最大值等于sum max=sum; } } ave=1.0*max/k; return ave; } }
上一篇:
92天倒计时,蓝桥杯省赛备赛攻略来啦~
下一篇:
leetcode算法题-390.消除游戏