快捷搜索: 王者荣耀 脱发

【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; } }
经验分享 程序员 微信小程序 职场和发展