479 字
2 分钟
代码随想录算法训练营第十天 | 栈与队列 Part02
栈与队列 Part02
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. 滑动窗口最大值
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 个高频元素
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/