LeetCode 239:滑动窗口(挑战自我,勇闯难关)
2023-12-13 11:22:48
我与 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 的征服之旅,将成为我编程生涯中一枚闪亮的勋章,激励我不断前行,探索更多未知的领域。