代码随想录算法训练营day11 | 150.逆波兰表达式求值、239.滑动窗口最大值、347.前K个高频元素

news/2025/2/23 22:00:13/文章来源:https://www.cnblogs.com/coderjxj/p/18731009

150.逆波兰表达式求值
栈的应用:后缀表达式求值

点击查看代码
class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> stk;for(int i = 0; i < tokens.size(); ++i) {if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {int ropnum = stk.top();stk.pop();int lopnum = stk.top();stk.pop();if(tokens[i] == "+") stk.push(lopnum + ropnum);else if(tokens[i] == "-") stk.push(lopnum - ropnum);else if(tokens[i] == "*") stk.push(lopnum * ropnum);else stk.push(lopnum / ropnum);}else {int weight = 1;int sum = 0;//将表示数字的字符串转为真正的数字int,存在sum中,再压栈for(int j = tokens[i].size() - 1; j >= 0; --j) {//注意有可能遇到负数的情况if(j == 0 && tokens[i][j] == '-') sum *= -1;else {sum += (tokens[i][j] - '0') * weight;weight *= 10;}}stk.push(sum);}}return stk.top();}
};

逆波兰表达式:

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

逆波兰表达式主要有以下两个优点:
1、去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
2、适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。

239.滑动窗口最大值
解法一:暴力解法(结果超时)

点击查看代码
class Solution {
public:int maxValue(vector<int> &nums, int left, int right) {int maxval = nums[left];for(int i = left + 1; i <= right; ++i) maxval = max(maxval, nums[i]);return maxval;}vector<int> maxSlidingWindow(vector<int>& nums, int k) {int left = 0;int right = left + k - 1;vector<int> result;while(right <= nums.size() - 1) {result.push_back(maxValue(nums, left, right));++left;++right;}return result;}
};

解法二:使用单调队列(难)

点击查看代码
class Solution {
private://实现单调队列,队头元素为当前窗口内的最大值,队内元素由大到小排列,仅保留有可能成为最大值的元素class MyQueue {private:deque<int> dque;public:    //小于等于待push元素x的元素,由于较小且比起x来说会更早滑出窗口,故后续不可能成为最大值,可直接pop//x需要插入到第一个比x大的值后面,等待前面的值均滑出窗口后,x就可以成为新的窗口内最大值,并且,排在//后面的元素必然是后入队的,必然会更晚滑出窗口void push(int x) { //x为即将滑入窗口的值//注意此处< x不能写成<= x,相同的值需要随着窗口滑动轮流成为最大值,并且随着pop自行淘汰//若写成<= x,该用例会报错[-7,-8,7,5,7,1,6,0] //预期为[7,7,7,7,7] 结果错误为[7,7,7,6,6]while(!dque.empty() && dque.back() < x) dque.pop_back();dque.push_back(x); }//x要么小于队头元素,要么等于,不可能大于,因为队头元素就是当前窗口最大值//若x等于队头元素,即当前窗口最大值,直接弹出,x后面的元素成为新的窗口最大值,//不用担心x之后元素不在新的窗口内,因为x后的元素必然是后入队的,必然会更晚滑出窗口void pop(int x) { //x为即将滑出窗口的值if(x == dque.front()) dque.pop_front();}int front() {return dque.front();}};
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {MyQueue myque;for(int i = 0; i < k; ++i) {myque.push(nums[i]);}vector<int> result;for(int i = k; i < nums.size(); ++i) {result.push_back(myque.front());myque.pop(nums[i-k]);myque.push(nums[i]);}result.push_back(myque.front());return result;}
};

347.前K个高频元素(难)
使用优先级队列priority_queue,即大/小顶堆,队头元素即为堆顶元素

点击查看代码
class Solution {
public://自定义比较规则,用于传入priority_queueclass myCompare {public:bool operator()(const pair<int, int> &left, const pair<int, int> &right) {//相当于队头在右边,右边小,则为小顶堆return left.second > right.second;}           };vector<int> topKFrequent(vector<int>& nums, int k) {//利用map统计每个元素的频率unordered_map<int, int> uomap;for(int i = 0; i < nums.size(); ++i)++uomap[nums[i]];//构建小顶堆,对map里的元素进行排序//堆中元素类型  底层容器类型  排序规则priority_queue<pair<int, int>, vector<pair<int, int>>, myCompare> pri_que;for(auto iter = uomap.begin(); iter != uomap.end(); ++iter) {pri_que.push(*iter);if(pri_que.size() > k)pri_que.pop(); //让堆始终保持k个最大的}//将筛选后的堆中元素的first域逐个放入用于返回的vector中vector<int> result(k);for(int i = k - 1; i >= 0; --i) {result[i] = pri_que.top().first;pri_que.pop();}return result;}
};

2025/02/23

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888591.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

包和抽象类介绍--java进阶day02

1.package包导包第二点需要注意 a包和b包都存有Student类,c包存有测试类,我们在c中创建Student对象,系统会询问你要哪个包的Student类,并自动帮你导包.在导完a包的学生类后,想要再次导入b包的学生类就不能再像之前那样导了全类名导包 通过带包名将b包重复的学生类导入2.抽…

2025.2.23(二进制等等)

平常我们生活使用的是十进制,在计算机中常用二进制等。 二进制是用0,1表示,逢二进1. 啊啊啊好难表达。 例如2在二进制中为10.哎上图片。。。。除2取余法,哎呀,不管了看图

Deveco Studio下载

Deveco Studio最新版本-下载中心根据自己的操作系统下载合适的版本即可 Windows环境 运行环境要求 为保证DevEco Studio正常运行,建议电脑配置满足如下要求:操作系统:Windows10 64位、Windows11 64位 内存:16GB及以上 硬盘:100GB及以上 分辨率:1280*800像素及以上安装Dev…

第一次作业—软件二次开发

一.项目来源 本次作业的项目来源是https://blog.csdn.net/m0_65636467/article/details/128069045?sharetype=blog&shareId=128069045&sharerefer=APP&sharesource=2301_80676751&sharefrom=link中的第7个C语言超市收款系统 二.运行环境和运行结果 1.运行环境…

《痞子衡嵌入式半月刊》 第 118 期

痞子衡嵌入式半月刊: 第 118 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

【牛客训练记录】牛客周赛 Round 82

训练情况赛后反思 C题没想明白,但是发现了数列一定是不增加的,另外第一次出现的数字,那个位置就必须是那个数字,剩下可能是乘法原理之类的东西吧,但是没做出来 A题 判断字符串第一位和最后一位是否一致即可点击查看代码 #include <bits/stdc++.h> // #define int lo…

【Atcoder训练记录】AtCoder Beginner Contest 394

训练情况赛后反思 没在赛时打的,只做了签到TAT A题 统计字符串中 2 的数量,最后去掉其他的,只输出 2点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;void solve(){string s; cin>>s;int ans = 0;for(int …

DPDK收发包梳理

DPDKeal初始化 内存管理:大页,内存池 驱动开启调试信息 make config T=x86_64-native-linuxapp-gcc export EXTRA_CFLAGS=-O0 -g3 -ggdb make -j8 dpdk通过makefile编译 meson + ninja没学过,太麻烦了,可以参考dpdk17的文档,里面有介绍make编译方式。 https://doc.dpdk.or…

空气流量和空气压力参数解耦系统simulink建模与仿真

1.课题概述空气流量和空气压力参数解耦系统simulink建模与仿真,在许多系统中,空气流量(Q)和压力(P)之间存在耦合关系,这意味着改变一个参数会影响到另一个参数。通过解耦系统解决这种问题,从而提高系统的控制稳定性。2.系统仿真结果 (完整程序运行后无水印)3.核心程序…

【库】Coravel Cache缓存

Coravel 通过使高级应用程序功能(如任务/作业调度、排队、缓存、邮件(以及更多!))易于访问且易于使用,帮助开发人员快速启动并运行 .NET 应用程序。具有简单、富有表现力和直接的语法。Coravel非常简单,通过Rember来保存缓存数据,同时可以设定缓存的时长,然后通过Get来…

4.优化器 - 模型评估

优化器 - optimizer优化器就是在深度学习反向传播过程中,指引损失函数(目标函数)的各个参数往正确的方向更新合适的大小,使得更新后的各个参数损失函数(目标函数)值不断逼近全局最小优化器不计算梯度,他只是梯度的更新者,它决定了以什么样的形式更新参数如果损失函数是…

【软件开发】CMake学习笔记

【软件开发】CMake 学习笔记 CMake 是什么? 是构建系统(如 Visual Studio)的文件(如 .vcxproj .sln)的创建器,具体要生成的构建系统可以通过 CMakePresets 文件中的 generator 指定。 构建系统一般不是跨平台的,但 CMake 支持在不同的操作系统上生成不同的构建系统文件,…