leetcode 四题
150 逆波兰表达式求值
239 滑动窗口最大值
347.前 K 个高频元素
栈与队列的小结
- 数据结构
- python中的实现与使用
150
逆波兰表示法 好法~
逆波兰表达式:
逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
逆波兰表达式主要有以下两个优点:
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中
后缀/中缀 是不是很容易想到 树 的 中序遍历和后序遍历
239
第二次写了,终于写出来了
用的是单调递减的双端队列~
from collections import deque
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
ans = []
if k>= len(nums):
return [max(nums)]
q = deque()
# 初始化 q 队列,双端队列,q为 nums值的下标
for i in range(k):
# 保持q单调递减
#这里是实现所有队列值(对应的nums值)均大于当前nums值
#依次比较队列中最小值与当前nums值的大小,
#若当前nums值大,那就替换掉(对应nums值)的队列值
while q and nums[q[-1]] <= nums[i]:
q.pop()
q.append(i)
#ans 存的是nums值
ans.append(nums[q[0]])
for i in range(k,len(nums)):
while q and nums[q[-1]] <= nums[i]:
q.pop()
q.append(i)
# 队列左侧为最大值,但可能存在 下标不在窗口范围内,
#按照窗口移动的规律和队列值保留的规律,队列中的下标只可能小于窗口左边界
#(在上一个while中,小于当前nums值的队列值(对应的nums值),队列值都被删掉了,所以只可能保留nums值大(于当前nums值)但下标小(于当前nums)的值)
while q and q[0] <= i-k: # 取等条件,取
q.popleft()
ans.append(nums[q[0]])
return ans
347
dict.items() 本质是 list,故可 sort,按key排序,reverse 获得从大到小的结果
dicts = sorted(dictn.items(), key=lambda item: item[1],reverse = True)