📜  滑动窗口最大值:设置 2(1)

📅  最后修改于: 2023-12-03 14:56:09.800000             🧑  作者: Mango

滑动窗口最大值:设置 2

简介

滑动窗口最大值问题是一个经典的算法问题,它要求我们在一个固定大小的窗口中找到每个窗口的最大值。在这个问题中,我们以滑动窗口的方式遍历整个数组,每次窗口滑动一步,并记录当前窗口中的最大值。

算法思想

滑动窗口最大值问题可以通过使用双端队列来解决。我们可以维护一个双端队列,其中存储的是当前窗口中的元素的索引。在遍历数组时,我们首先检查双端队列的头部元素是否超出了当前窗口的范围,如果是,则将其从队列中移除。然后,我们比较当前元素与队列尾部元素的大小,如果当前元素大于队列尾部元素,则将队列尾部元素移除,直到当前元素小于等于队列尾部元素或队列为空。最后,我们将当前元素的索引添加到队列的尾部。这样,双端队列的头部元素就是当前窗口的最大值。

示例代码
def max_sliding_window(nums: List[int], k: int) -> List[int]:
    result = []
    deque = []

    for i in range(len(nums)):
        # 检查队列头部元素是否超出窗口范围
        if deque and deque[0] <= i - k:
            deque.pop(0)

        # 移除比当前元素小的队列尾部元素
        while deque and nums[deque[-1]] < nums[i]:
            deque.pop()

        # 添加当前元素到队列尾部
        deque.append(i)

        # 当窗口大小达到k时,将队列头部元素加入结果中
        if i >= k - 1:
            result.append(nums[deque[0]])

    return result
复杂度分析
  • 时间复杂度:由于每个元素最多会被放入队列一次,因此时间复杂度为 O(n),其中 n 是数组的大小。
  • 空间复杂度:队列的大小取决于窗口的大小 k,因此空间复杂度为 O(k)。
总结

滑动窗口最大值问题是一个非常有用的算法问题,通过使用双端队列可以高效地解决。我们可以通过维护一个递减的双端队列来记录当前窗口的最大值。这个算法的时间复杂度为 O(n),其中 n 是数组的大小,空间复杂度为 O(k),其中 k 是窗口的大小。在实际应用中,滑动窗口最大值问题常常用于解决数组相关的问题,比如求解移动窗口的平均值、中位数等。