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.题目链接
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-average-subarray-i文章来源:https://www.toymoban.com/news/detail-703357.html
3.思路讲解
笔者最开始解这道题的时候使用的是暴力解法,结果最后超过了时间限度,然后又对算法进行了优化,要找出平均数最大的长度为 k 的连续子数组,那么只需找出总和最大的长度为 k 的连续子数组,首先计算前k个数的和作为初始值,也作为最大值,然后从第k个数开始向后移动,每次移动子数组和的变化是加上当前元素的值,减去当前元素的k个元素之前的值,每次移动子数组就是进去一个数出去一个数。每次移动都比较一下当前总和与最大值的大小,若大于最大值,则最大值就等于当前总和,最后即可找出具有最大总和的长度为 k 的连续子数组,然后除以k,就得到平均数。文章来源地址https://www.toymoban.com/news/detail-703357.html
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; } }
到了这里,关于【leetcode17-----子数组最大平均数】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!