返回

LeetCode 239:滑动窗口(挑战自我,勇闯难关)

前端

我与 LeetCode 239 的较量,犹如一场高强度的博弈,既考验智力,也挑战耐力。这道困难题如同巍峨的山峰,横亘在我面前,一开始让我心生畏惧,但随着不懈的努力和深入钻研,我逐渐掌握了破解之法,最终成功登顶。

本文将带领你领略这段解题之旅,分享我从畏惧到征服的心路历程。我们将深入探讨单调队列在滑动窗口中的巧妙应用,以期激发你的灵感,助你攻克更多编程难题。

从畏惧到征服:解题历程

起初,LeetCode 239 的题面让我心生畏惧。它要求在给定数组中找出指定大小滑动窗口内的最大值。作为一个初学者,我从未接触过滑动窗口算法,更不用说用它解决如此复杂的问题了。

然而,我不甘心就此放弃。我花了好几个小时研究滑动窗口算法的原理和实现方法。经过反复思考和尝试,我逐渐理解了它的精髓:利用滑动窗口在数组中移动,每次仅更新受影响的部分,从而降低时间复杂度。

但难题并没有就此止步。如何在滑动窗口中高效地找出最大值,成了我面临的下一个挑战。这时,我偶然间接触到了单调队列的数据结构,它可以巧妙地解决这一问题。

单调队列:滑动窗口的利器

单调队列是一种特殊的队列,它保证队列中元素始终保持单调递增或递减的顺序。在滑动窗口算法中,我们可以将单调队列用作滑动窗口的缓冲区,以有效地维护滑动窗口内的最大值或最小值。

当滑动窗口向右移动时,我们将新元素添加到队列尾部。如果新元素比队列尾部的元素大,则将队列尾部元素弹出,直到队列中所有元素都比新元素小为止。这样,队列头部元素始终是滑动窗口内的最大值。

当滑动窗口向左移动时,我们将队列头部元素弹出,因为该元素已不在滑动窗口内。

代码实现:步步为营

掌握了单调队列的原理,我开始着手编写代码。一开始,我遇到了许多小问题,比如数组越界和空指针异常。但我没有气馁,逐行检查代码,仔细调试,最终解决了这些问题。

def maxSlidingWindow(nums, k):
    # 创建单调队列
    q = deque()

    # 初始化结果数组
    res = []

    for i in range(len(nums)):
        # 将新元素添加到队列尾部
        while q and nums[q[-1]] < nums[i]:
            q.pop()
        q.append(i)

        # 如果队列头部的元素超出滑动窗口,则弹出
        if i - q[0] >= k:
            q.popleft()

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

    return res

总结:宝剑锋从磨砺出

解决 LeetCode 239 的过程并非一帆风顺,但它让我受益匪浅。我不仅掌握了滑动窗口算法和单调队列数据结构的原理,更重要的是,我体会到了坚持不懈的重要性。

编程之路充满挑战,但只要我们勇于尝试,勤于思考,就一定能突破自我,克服一个个难题。LeetCode 239 的征服之旅,将成为我编程生涯中一枚闪亮的勋章,激励我不断前行,探索更多未知的领域。