T11 - T20

11. 滑动窗口最大值

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func maxSlidingWindow(nums []int, k int) []int {
    if len(nums) == 0 || k == 0 {
        return []int{}
    }
    // 结果存储数组
    res := make([]int, 0, len(nums)-k+1)
    // 创建双端队列
    deque := []int{}
    for i := 0; i < len(nums); i++ {
        // 队首是最大值,不断 pop 队尾的元素
        for len(deque) > 0 && nums[i] >= nums[deque[len(deque)-1]] {
            deque = deque[:len(deque)-1]
        }
        // 新元素放入队尾
        deque = append(deque, i)
        // 队头下标在窗口外的情况
        if deque[0] <= i-k {
            deque = deque[1:]
        }
        // 开始存入结果的条件判断和后续存入结果
        if i >= k-1 {
            res = append(res, nums[deque[0]])
        }
    }
    return res
}

12. 最小覆盖子串