首页 > 其他分享 >代码训练营 Day11 | 150. 逆波兰表达式求值 | 239. 滑动窗口最大值 | 347.前 K 个高频元素

代码训练营 Day11 | 150. 逆波兰表达式求值 | 239. 滑动窗口最大值 | 347.前 K 个高频元素

时间:2024-08-26 11:57:24浏览次数:8  
标签:150 nums 队列 self 元素 pop push 347 求值

150. 逆波兰表达式求值

逆波兰表达式(后缀表达式)

  1. (1+2)x(3+4)的后续表达顺序是: 左右中
  2.   后缀表达式:12+34+x

使用栈 思路

1. 遇见数字就放入栈,遇见操作运算符,取出栈里的数字进行运算

2. 每次取元素的时候只取两个元素

3. 结果就是栈最后的元素

class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        # create a stack
        stack = []

        # iterate the array
        for i in range(len(tokens)):
            # if we met the operater
            if tokens[i] == '+' or tokens[i] == '-' or tokens[i] == '*' or tokens[i] == '/':
                # since it's operater, we need prepare number 
                num1 = stack.pop()
                num2 = stack.pop()

                # plus
                if tokens[i] == '+':
                    stack.append(int(num2+num1))
                # minus
                elif tokens[i] == '-':
                    stack.append(int(num2-num1))
                # mul
                elif tokens[i] == '*':
                    stack.append(int(num2*num1))
                # div
                elif tokens[i] == '/':
                    # aviod round down, and if it's ngeative number abs first and use negative sign
                    result = int(num2 / num1) if num2 * num1 > 0 else -(abs(num2) // abs(num1))
                    stack.append(result)
            
            # if it is number
            else:
                # put the number into stack
                stack.append(int(tokens[i]))
        
        # return answer
        return stack[-1]
        

239. 滑动窗口最大值(一刷理解思路即可)

1. 每滑动一次pop()一个元素,对应的也要push()一个元素

2. 每移动一个位置把遗弃的元素给pop掉,把新加入的元素push进来

3. 每次在get max value查看最大值

单调队列

  1. 如果队列有比当前元素小的元素,把队列前面全部元素弹出,直到前面的元素没有当前元素小的为止
    1. 这样就可以维护最大值
  2. push的规则:
    1. 如果push进来的元素比前面大,弹出前面的元素,直到前面的元素比当前元素大为止
    2. 然后获取最大值
  3.   滑动窗口移动往后移动一位
  4.  最大值一直是维护在我们队列的出口处
    1. pop是只有在;出口元素是之前窗口最大值的时候才pop,其他情况push就把不相关的元素弹走了
    2. 弹出的元素和队列的出口处的元素相同的话
    3. 说明弹出的元素是当前滑动窗口的最大值
from  collections import deque
class MyQueue: # 单调队列(从大到小)
    def __init__(self):
        self.queue = deque() #这里需要使用deque实现单调队列,直接使用list会超时
    
    # 每次弹出的时候,比较当前的数值是否等于队列出口的数值,如果等于则弹出
    # 同时pop之前判断队列当前是否为空
    def pop(self,value):
        if self.queue and value == self.queue[0]:
            self.queue.popleft()

    # 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
    # 这样就保持了单调从大到小,队列口是最大值
    def push(self,value):
        # 判断是否需要弹出除了我们push的value以外的所有元素
        while self.queue and value >= self.queue[-1]:
            self.queue.pop()
        # 添加元素
        self.queue.append(value)
    
    # 查询目前队列里最大值并返回;直接返回队列前端也就是front就可以了。
    def front(self):
        return self.queue[0]


class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        que = MyQueue()
        result = []
        # 先将前k的元素放进队列
        for i in range(k):
            que.push(nums[i])
        #result记录前k的元素最大值
        result.append(que.front())
        # 根据k的值来滑动窗口
        for i in range(k,len(nums)):
            # 滑动窗口移除最前面的元素
            que.pop(nums[i-k])
            # 滑动窗口前加入最后面的值
            que.push(nums[i])
            # 记录对应的最大值
            result.append(que.front())
        
        return result
        

347.前 K 个高频元素

MAP思路

1. 对元素出现频率进行排序的话使用map

2. key: 是存放我们这里边的元素

3. value: 就是我们元素出现的次数

4. 以value做一个从大到小的排序

5. 输出前k个元素

大顶堆小顶堆 思路

1. 擅长在很大的数据集中求前k个高频或者低频的一个操作

2. 大顶堆: 头部的元素都要比孩子节点的元素大;根节点是最大的元素

3. 小顶堆: 根节点是最小的元素;父亲总是要比左右两个孩子的数值要小

4. 用堆来遍历一遍map里面所有的元素,然后堆里就维持k个元素

5. 使用小顶堆来实现: 每次push进来一个新元素,也要pop一个堆顶的元素

   1. 由于小顶堆根节点是最小值,每次push新元素进来都会把最小的给pop出去

   2. 遍历完成之后只会有最大的值留在堆里面

import heapq
class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        # 统计元素出现的频率
        map_ = {} # nums[i] 对应出现的次数
        for i in range(len(nums)):
            map_[nums[i]] = map_.get(nums[i],0)+1

        
        # 对频率排序
        # 定义一个小顶堆,大小为K
        pri_que = [] # 小顶堆

        # 用固定大小为K的小顶堆,扫描所有频率的数量
        for key,freq in map_.items():
            heapq.heappush(pri_que,(freq,key))
            if len(pri_que) > k:
                # 如果堆的大小小于了K,则队列弹出,保证堆的大小一直为k
                heapq.heappop(pri_que)
            
        
        # 找出前K个高频元素,因为小顶堆先弹出是最小的,所以倒叙来输出数组
        result = [0] * k
        for i in range(k-1,-1,-1):
            result[i] = heapq.heappop(pri_que)[1]

        return result

标签:150,nums,队列,self,元素,pop,push,347,求值
From: https://blog.csdn.net/NeighborKing/article/details/141483516

相关文章

  • 超详细教程 | Hands-On 基于 Flagchip FC4150 MCAL-使用 GPT 模块定时喂狗
    简介    本文将详细介绍如何使用EB工具配置FlagchipFC4150MCAL使用GPT模块定时喂狗,并重点强调了配置GPT、WDG模块的过程以及对GPT、WDG模块的详细解释,关于mcu、port、dio、icu、adc、pwm模块可参考之前发布的博文。本次示例演示将会使用FTU4_CH0超......
  • NS4150C 3.0W 单声道 D类音频功率放大器
    1特性●工作电压范围:3.0V~5.0V●输出功率:2.8W(5V/4Ω,THD=10%)●0.1%THD(0.5W/3.6V)●高达88%的效率●高PSRR:-80dB(217Hz)●无需滤波器Class-D结构●优异的全带宽EMI抑制能力●优异的“上电,掉电”噪声抑制●低静态电流:4mA(3.6V电源、Noload)●过......
  • Leetcode面试经典150题-72.编辑距离
    解法都在代码里,不懂就留言或者私信动态规划最经典题之一,如果写不出来,动态规划好好再学学classSolution{/**这个题是动态规划最经典的题,另一个最经典的是背包问题*/publicintminDistance(Stringword1,Stringword2){/**如果一个为0,取另外一个的长......
  • 150页的极简大模型入门蛇尾书,学大模型太简单了
    如果问个问题:有哪些产品曾经创造了伟大的奇迹?ChatGPT应该会当之无愧入选。仅仅发布5天,ChatGPT就吸引了100万用户——当然,数据不是关键,关键是其背后的技术开启了新的AI狂潮,成为技术变革的点火器。就算我们这些周边吃瓜群众都日日活在ChatGPT带来的震撼里,更不用说在......
  • 【LeetCode面试150】——36有效的数独
    博客昵称:沈小农学编程作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟!PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!......
  • 【LeetCode面试150】——3无重复数组的最长子串
    博客昵称:沈小农学编程作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟!PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!......
  • WPF ystem.Windows.Markup.XamlParseException HResult=0x80131501 Message='Spec
    System.Windows.Markup.XamlParseExceptionHResult=0x80131501Message='Specifiedclassname'WpfApp268.MainWindow'doesn'tmatchactualrootinstancetype'System.Windows.Window'.RemovetheClassdirectiveorprovideanin......
  • 力扣面试经典算法150题:跳跃游戏
    跳跃游戏今天的题目是力扣面试经典150题中的数组的中等难度题:跳跃游戏。题目链接:https://leetcode.cn/problems/jump-game/description/?envType=study-plan-v2&envId=top-interview-150题目描述给定一个非负整数数组nums,你最初位于数组的第一个下标,即nums[0]。数......
  • leetcode面试经典150题- 3. 无重复字符的最长子串
    https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&envId=top-interview-150  packageleetcode150import"testing"funcTestLengthOfLongestSubstring(t*testing.T){s:=&qu......
  • 题解 |栈| #中缀表达式求值!!!!#
    描述请写一个整数计算器,支持加减乘三种运算和括号。数据范围:0≤∣s∣≤1000≤∣s∣≤100,保证计算结果始终在整型范围内要求:空间复杂度: O(n)O(n),时间复杂度 O(n)O(n)示例1输入:"1+2"返回值:3示例2输入:"(2*(3-4))*5"返回值:-10示例3输入:"3+2*3*4-1"返回值:26一、使......