训练营刷题_day11_python

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)
在这里插入图片描述

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值