Swift 数据结构与算法( 16) 数组 + Leetcode643. 子数组最大平均数 I (滑动窗口)

168 阅读1分钟

题目

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.length
  • 1 <= 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)

截屏2023-08-05 00.16.38.png