leetcode239滑动窗口最大值

leetcode 239 Sliding Window Maximum

Posted by BY on August 14, 2020

前言

持续更新了

正文

问题来源

本问题来自leetcode上的239题。

问题描述

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值

示例 1:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7] 
解释: 

  滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

分析:

func maxSlidingWindow(nums []int, k int) []int {
    res := make([]int, 0, len(nums)-k+1)
    deque := make([]int, 0)
    var clean func(i, k int)
    clean = func(i, k int) {
        if len(deque) > 0 && deque[0] == i-k {
            deque = deque[1:]
        }
        for len(deque) > 0 && nums[deque[len(deque)-1]] < nums[i] {
            deque = deque[:len(deque)-1]
        }
        deque = append(deque, i)
    }
    for i := 0; i < k; i++ {
        clean(i, k)
    }
    res = append(res, nums[deque[0]])
    for i := k; i < len(nums); i++ {
        clean(i, k)
        res = append(res, nums[deque[0]])
    }
    return res
}

总结:

勤思考。

结语

不管怎么样好好加油。