这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战。
题目描述:
643. 子数组最大平均数 I - 力扣(LeetCode) (leetcode-cn.com)
给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。
任何误差小于 10^-5的答案都将被视为正确答案。
示例一
输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
示例二
输入: nums = [5], k = 1
输出: 5.00000
提示:
n == nums.length1 <= k <= n <= 10^5-10^4 <= nums[i] <= 10^4
思路分析
滑动窗口
根据题意,我们的长度为固定的K,既然长度固定,那么平均值最大即代表和最大,我们只需要一个长度为k的窗口,每次求出这个窗口内的k个数的和,同时记录,等下一次与这次比较,两者取其大
这有个小小的优化点就是,我们每向右边移动一步,其实不必再重新求和,这样如果k很大的话,会造成很多的浪费,每次滑动我们只需要将上次的和减去滑出去(头)再加上滑进来(尾)的即可得到本次的和。
AC代码
class Solution {
fun findMaxAverage(nums: IntArray, k: Int): Double {
var sum = 0
for(i in 0 until k) {
sum += nums[i]
}
var maxSum = sum
for(i in k until nums.size) {
sum = sum - nums[i-k] + nums[i]
maxSum = Math.max(maxSum,sum)
}
return maxSum.toDouble() / k
}
}
总结
滑动窗口类的题还是很容易理解的,知名见意,我们就当手上拿了一个长度为k的框框套在数组上即可。
参考
子数组最大平均数 I - 子数组最大平均数 I - 力扣(LeetCode) (leetcode-cn.com)
643. 子数组最大平均数 I - 子数组最大平均数 I - 力扣(LeetCode) (leetcode-cn.com)