leetcode热题100——day10(双端队列deque)

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

示例 2:

输入:nums = [1], k = 1
输出:[1]

双端队列deque

collections模块常用类型有:

双向队列(deque)
类似于list的容器,可以快速的在队列头部和尾部添加、删除元素
请点击deque

计数器(Counter)
dict的子类,计算可hash的对象
请点击Counter

默认字典(defaultdict)
dict的子类,可以调用提供默认值的函数
请点击defaultdict

有序字典(OrderedDict)
dict的子类,可以记住元素的添加顺序

可命名元组(namedtuple)
可以创建包含名称的tuple

这篇文章有详细用法

AC代码

from collections import deque

class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        # 定义返回的列表
        ans = []
        # 双端队列用于存储索引
        dq = deque()
        n = len(nums)

        for i in range(n):
            # 移除队列中不在当前窗口内的元素
            while dq and dq[0] < i - k + 1:
                dq.popleft()
            # 移除队列中比当前元素小的元素
            while dq and nums[dq[-1]] < nums[i]:
                dq.pop()
            # 将当前元素的索引加入队列
            dq.append(i)
            # 当窗口形成后,将队列头部的元素加入结果列表
            if i >= k - 1:
                ans.append(nums[dq[0]])

        return ans

思路

利用双端队列可以弹出左右第一个元素的特性,将当前窗口的最大值的索引存储在队列左端,当最大元素不在当前窗口时就移除最左端的队列元素。

你可能感兴趣的:(leetcode,算法)