479 字
2 分钟
代码随想录算法训练营第十天 | 栈与队列 Part02

栈与队列 Part02#


150. 逆波兰表达式求值#

LeetCode 150. 逆波兰表达式求值

class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for char in tokens:
if char in "+-*/":
right = stack.pop()
left = stack.pop()
if char == '+':
res = left + right
stack.append(res)
elif char == '-':
res = left - right
stack.append(res)
elif char == '*':
res = left * right
stack.append(res)
else:
# 这里需要使用 int() 来确保结果是整数除法,
# 如果使用 // 会导致负数除法结果不正确
# 例如 -1 // 2 会得到 -1,而 int(-1 / 2) 会得到 0
res = int(left / right)
stack.append(res)
else:
stack.append(int(char))
return stack.pop()

239. 滑动窗口最大值#

LeetCode 239. 滑动窗口最大值

from collections import deque
class Solution:
# 构造单调递减队列,每次入队列检查当前值和队列中最后一个值的大小关系
# 当前值比队列中最后一个值大时,弹出队列中最后一个值
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
wid = deque()
n = len(nums)
res = []
for i in range(n):
# 保持队列单调递减
while wid and nums[i] > wid[-1]:
wid.pop()
wid.append(nums[i])
# 如果滑动窗口已经满了,检查是否需要移除窗口最左边的元素
if i >= k:
if nums[i - k] == wid[0]:
wid.popleft()
# 从第一个完整窗口开始记录结果
if i >= k - 1:
res.append(wid[0])
return res

347. 前 K 个高频元素#

LeetCode 347. 前 K 个高频元素

import heapq
class Solution:
# 先使用 map 来记录每个元素的出现次数
# 然后使用最小堆(优先队列)来维护前 k 个出现次数最多的元素
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
count = {}
for num in nums:
count[num] = count.get(num, 0) + 1
pq = []
for key, value in count.items():
# 维护一个小顶堆,堆的大小保持为 k
heapq.heappush(pq, (value, key))
if len(pq) > k:
heapq.heappop(pq)
res = [0] * k
# 注意这里从堆中取出时是从小到大,需要逆序填入结果数组
for i in range(k - 1, -1, -1):
res[i] = heapq.heappop(pq)[1]
return res
代码随想录算法训练营第十天 | 栈与队列 Part02
https://fuwari.vercel.app/posts/code_musings_day_ten/
作者
Jarrett
发布于
2025-06-21
许可协议
CC BY-NC-SA 4.0