题目
Leetcode643. 子数组最大平均数 I
给你一个由 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.length1 <= k <= n <= 105-104 <= nums[i] <= 104
解题思路🙋🏻 ♀️
假设有以下输入数组 nums = [1,12,-5,-6,50,3],将使用这个输入来步骤化解释上面的 Swift 代码。
初始状态:
nums = [1, 12, -5, -6, 50, 3]
k = 4
left = 0
right = 0
sum = 0
maxSum = Int.min
Step 1:
计算第一个窗口的和,窗口的大小是 k = 4。
nums = [1, 12, -5, -6, 50, 3]
sum = 1 + 12 - 5 - 6 = 2
right = 4
maxSum = 2
Step 2:
滑动窗口,移除 nums[left],加入 nums[right]。
nums = [1, 12, -5, -6, 50, 3]
sum = sum - nums[left] + nums[right] = 2 - 1 + 50 = 51
left = 1
right = 5
maxSum = max(maxSum, sum) = max(2, 51) = 51
Step 3:
再次滑动窗口,移除 nums[left],加入 nums[right]。
nums = [1, 12, -5, -6, 50, 3]
sum = sum - nums[left] + nums[right] = 51 - 12 + 3 = 42
left = 2
right = 6
maxSum = max(maxSum, sum) = max(51, 42) = 51
这时,right = nums.count,所以停止滑动窗口。
最后,返回 maxSum / k,即 51 / 4 = 12.75,这就是原数组中长度为 k 的连续子数组的最大平均数。
代码
//: [Previous](@previous)
import Foundation
class Solution {
func findMaxAverage(_ nums: [Int], _ k: Int) -> Double {
//
var left = 0
var right = 0
var sum = 0
var maxSum = 0
var newK = k
while newK > 0 {
newK -= 1
sum += nums[right]
right += 1
}
maxSum = sum
while right < nums.count {
sum = sum - nums[left] + nums[right]
maxSum = max(maxSum, sum)
left += 1
right += 1
}
return Double(maxSum) / Double(k)
}
}
时空复杂度分析
O (n)