📜  数据结构|队列|问题8(1)

📅  最后修改于: 2023-12-03 15:40:01.577000             🧑  作者: Mango

队列问题8:寻找窗口中的最大值

问题描述

给定一个数组nums和一个整数k,有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。你只能看到在窗口k内的数字。每次滑动窗口向右移动,找到窗口内的最大值。

例如,输入: nums = [1,3,-1,-3,5,3,6,7] 和 k = 3 ,输出: [3,3,5,5,6,7]。

解决方案

从题目可以看出,题目想要我们在一个不断滑动的窗口中,寻找窗口中的最大值。我们首先想到的是,可以将问题抽象为一个队列问题。

先将队列填满k个元素,找出其中的最大值并记录。每次向右移动queue,将新的元素加入队列,弹出队列左侧的的元素,如果它是最大值,那么我们需要重新找到所有元素的最大值,否则仅需要比较新元素是否和queue中已有的元素比较。

具体实现的时候,我们可以使用双向队列deque来维护这个队列。

from collections import deque

def maxSlidingWindow(nums, k):
    res = []
    q = deque()
    for i in range(k):
        while q and nums[i] >= nums[q[-1]]:
            q.pop() 
        q.append(i)
    for i in range(k, len(nums)):
        res.append(nums[q[0]])
        while q and nums[i] >= nums[q[-1]]:
            q.pop()
        while q and q[0] <= i - k:
            q.popleft()
        q.append(i)
    res.append(nums[q[0]])
    return res

以上就是问题8寻找窗口中的最大值的解决方案。具体代码实现完整简洁,易于理解,时间复杂度为O(n),空间复杂度为O(k)。

总结

对于队列问题,我们可以通过使用deque实现高效的队列操作。对于不断滑动的窗口问题,我们可以利用队列和双指针的方式进行求解。通过对于队列操作和双指针操作的熟练掌握,我们可以解决很多实际问题。