首页 > 编程语言 >代码随想录算法训练营第11、12天 | 逆波兰表达式、滑动窗口最大值、前 K 个高频元素

代码随想录算法训练营第11、12天 | 逆波兰表达式、滑动窗口最大值、前 K 个高频元素

时间:2024-06-14 22:34:27浏览次数:27  
标签:11 node 12 nums int res self 随想录 queue

逆波兰表达式题目
https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/
逆波兰表达式代码随想录 https://programmercarl.com/0150.逆波兰表达式求值.html#其他语言版本
滑动窗口最大值
https://leetcode.cn/problems/sliding-window-maximum/
滑动窗口最大值代码随想录
https://programmercarl.com/0239.滑动窗口最大值.html
前K个高频元素
https://leetcode.cn/problems/top-k-frequent-elements/description/
前K个高频元素代码随想录
https://programmercarl.com/0347.前K个高频元素.html

逆波兰表达式

题目

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 '+'、'-'、'*' 和 '/' 。

  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断 。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
    答案及所有中间计算结果可以用 32 位 整数表示。

题解

  • res栈 存放当前运算的两个数字
  • 在"/"和"-"的时候需要注意先后顺序
  • "/"的结果后 int()

题解代码

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        res = []
        item = ['*','/','+','-']
        for i in tokens:
            if i not in item:
                res.append(int(i))
            if i in item:
                node_1 = res.pop()
                node_2 = res.pop()
                if i == '*':
                    node = node_1*node_2
                    res.append(node)
                if i == "+":
                    node = node_1+node_2
                    res.append(node)
                if i=="-":
                    node = node_2-node_1
                    res.append(node)
                if i=="/":
                    node = int(node_2/node_1)
                    res.append(node)
        return res[0]

滑动窗口最大值

题目

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。

题解

  • 优先级队列 队列目前最前面的值为最大值;如果新的值大于该值,弹出再加入;
  • 模拟滑动窗口的步骤:1)先初始化滑动窗口 2)滑动窗口移动:1.先弹出 2.再加入;

题解代码

class myqueue:
    def __init__(self):
        self.queue = collections.deque()
    def push(self,value):
        num = len(self.queue)
        while self.queue and value>self.queue[-1]:
            self.queue.pop()
        self.queue.append(value)
    def pop(self,value):
        if self.queue and value==self.queue[0]:
            self.queue.popleft()
    def front(self):
        return self.queue[0]

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        queue = myqueue()
        for i in range(k):
            queue.push(nums[i])
        res = []
        res.append(queue.front())

        for i in range(k,len(nums)):
            queue.pop(nums[i-k])
            queue.push(nums[i])
            res.append(queue.front())
        return res

前 K 个高频元素

题目

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

题解

  • 重要数据结果:heapq python中的重点库
    操作:1)heapq.heappush(queue,(key,freq)) 2)heapq.heappop()
  • 先用map采集数据;然后用小堆栈排序

题解代码

import heapq
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        map_ = {}
        for i in range(len(nums)):
            map_[nums[i]] = map_.get(nums[i],0)+1
        ##收集map的dict
        ##用pri_que heapq.heappush和heapq.heappop
        pri_que = []
        for key,freq in map_.items():
            heapq.heappush(pri_que,(freq,key))
            if len(pri_que)>k:
                heapq.heappop(pri_que)
        res = []
        for i in range(len(pri_que)):
            res.append(heapq.heappop(pri_que)[1])
        return res[::-1]

标签:11,node,12,nums,int,res,self,随想录,queue
From: https://www.cnblogs.com/P201821440041/p/18248759

相关文章

  • 代码随想录算法训练营第38天 | 509. 斐波那契数 、70. 爬楼梯 、746. 使用最小花费爬
    理论基础无论大家之前对动态规划学到什么程度,一定要先看我讲的动态规划理论基础。如果没做过动态规划的题目,看我讲的理论基础,会有感觉是不是简单题想复杂了?其实并没有,我讲的理论基础内容,在动规章节所有题目都有运用,所以很重要!如果做过动态规划题目的录友,看我的理论基础就......
  • 6.11
    重读《构建之法》,我再次被其深邃的洞察力和实用的指导意义所打动。这本书不仅仅是软件开发领域的指南,更是一次对技术创新、团队合作和项目管理智慧的深度挖掘。以下是我此次阅读的一些新感悟:首先,书中关于技术债务的概念让我有了更深一层的理解。作者将技术债务比喻为金融债务,指出......
  • 111
    #include<bits/stdc++.h>usingnamespacestd;intmain(){intn;cin>>n;if(n==1){cout<<1;return0;}vector<int>a,sum;stringx=to_string(n);for(inti=x.size()-1;i>=0;i--){......
  • 在 Microsoft SQL Server 2012 中,修改密码的方法与 SQL Server 2000 相比有所变化,但基
    在MicrosoftSQLServer2012中,修改密码的方法与SQLServer2000相比有所变化,但基本思路是相似的。以下是几种常见的方法:使用SQLServerManagementStudio(SSMS):这仍然是最常见和推荐的方法。通过打开SQLServerManagementStudio,连接到相应的SQLServer实例,然后......
  • DreamJudge-1217-国名排序
    1.题目描述TimeLimit:1000msMemoryLimit:256mb问题描述:小李在准备明天的广交会,明天有来自世界各国的客房跟他们谈生意,小李要尽快的整理出名单给经理,你能帮他把客户来自的国家按英文字典次序排好吗?例如小李手上有来自加拿大,美国,中国的名单,排好的名单应是美国,加拿......
  • DreamJudge-1159-成绩排序2.0
    1.题目描述TimeLimit:1000msMemoryLimit:32768mb用一维数组存储学号和成绩,然后,按成绩排序输出。输入输出格式输入描述:输入第一行包括一个整数N(1<=N<=100),代表学生的个数。接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。输出描述:按照学生的成......
  • 5.11
    今日学习情况总结与小组成员讨论如何完善咨询中的自我测试页面的测试代码行量:159行学习所花时间:1h   packagecom.example.memosystem.activity;importandroid.content.DialogInterface;importandroid.content.SharedPreferences;importandroid.os.Bundle;importand......
  • 代码随想录——链表1——基本介绍与3种语言实现
    ......
  • Navicat for MySQL 11软件下载及安装教程
    NavicatforMySQL是一款强大的MySQL数据库管理和开发工具,它为专业开发者提供了一套强大的足够尖端的工具,但对于新用户仍然易于学习。NavicatforMySQL基于Windows平台,为MySQL量身订作,提供类似于MySQL的用管理界面工具,此解决方案的出现,将解放PHP、J2EE等程序员以及......
  • 6.11小测代码
    以下为会议预约管理系统的部分代码BookMeetingActivity.javapackagecom.example.myapplication611;importandroid.os.AsyncTask;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.ArrayAdapter;importandroid.widget.Button;importandro......