[LeetCode]day33 150.逆波兰式求表达值 + 239.滑动窗口最大值
逆波兰式求表达值
题目链接
题目描述
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。
示例 1:
输入:tokens = [“2”,“1”,“+”,“3”,“*”]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入:tokens = [“4”,“13”,“5”,“/”,“+”]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
示例 3:
输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,““,”/“,””,“17”,“+”,“5”,“+”]
输出:22
解释:该算式转化为常见的中缀算术表达式为:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
提示:
1 <= tokens.length <= 104
tokens[i] 是一个算符(“+”、“-”、“*” 或 “/”),或是在范围 [-200, 200] 内的一个整数
题解

代码书写
class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int>s;for(int i=0;i<tokens.size();i++){if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){int num1,num2;num2 = s.top();s.pop();num1 = s.top();s.pop();if(tokens[i]=="+") s.push(num1+num2);else if(tokens[i]=="-") s.push(num1-num2);else if(tokens[i]=="*") s.push(num1*num2);else if(tokens[i]=="/") s.push(num1/num2);}else{//注意把字符串转换成数组s.push(stol(tokens[i]));}}int re = s.top();return re;}
};
239.滑动窗口最大值
题目链接
题目描述
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
示例 2:
输入:nums = [1], k = 1
输出:[1]
提示:
1 <= nums.length <= 10^5
-104 <= nums[i] <= 10^4
1 <= k <= nums.length
解题
解法一:暴力解法

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int>re;for(int i=0;i<=nums.size()-k;i++){auto begin = nums.begin()+i;auto end = nums.begin()+i+k;auto max = max_element(begin,end);re.push_back(*max);}return re;}
};
喜提超时

尝试用条件进行剪枝,省去一些不必要的判断,比如最大值还没有被移出滑动窗口并且新加进来的元素小于最大值时就没有必要调用寻找最大值的函数
class Solution {
public:int findMaxIndex(vector<int>&nums,int begin,int end){int max = nums[begin];int re=begin;for(int i = begin;i<end;i++){if(nums[i]>max){max = nums[i];re = i;}}return re;}vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int>re;if (nums.empty() || k <= 0) return re;int index= findMaxIndex(nums,0,k);int max= nums[index];for(int i=0;i<=nums.size()-k;i++){if((i>0 && index==i-1)||nums[i+k-1]>nums[index]){index = findMaxIndex(nums,i,i+k);}re.push_back(nums[index]);}return re;}
};

稍微好了一些 这次过到47个用例
解法二.单调队列
我们使用一个队列,在这个队列中,只存放可能成为最大值的数字。
为了避免排序算法带来的时间复杂度,我们不排序,怎么获得当前窗口中最大的数字呢?
我们希望队列的第一个元素就是当前窗口中最大的数字,这样就能直接弹出来。
所以队列中一定呈现非增的特征
所以在进行push()时,如果发现队列末尾的元素比即将入队的元素小,就要把该元素pop出去;
注意这个队列实现的底层是deque,则元素可以从两头出
在进行pop()操作时,可能会出现要弹出滑动窗口的那个元素在更大的元素push进来时,就被弹出了,就不用真的进行pop()。需要真的进行pop()的情况为滑动窗口弹出的元素恰好为原来的最大元素且新加入滑动窗口的元素没有原来的大
如:
举个栗子:

class MyQueue{public:deque<int>q;void push(int value){while(!q.empty()&&value>q.back()){q.pop_back();}q.push_back(value);}void pop(int value){if(!q.empty()&&value==q.front()){q.pop_front();}}int getMax(){return q.front();}
};
class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int>re;MyQueue q;for(int i =0;i<k;i++){q.push(nums[i]);}re.push_back(q.getMax());for(int i=k;i<nums.size();i++){q.push(nums[i]);q.pop(nums[i-k]);re.push_back(q.getMax());}return re;}
};
相关文章:
[LeetCode]day33 150.逆波兰式求表达值 + 239.滑动窗口最大值
逆波兰式求表达值 题目链接 题目描述 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 ‘’、‘-’、‘*’ 和 ‘/’ 。 每个操作数(运…...
【银河麒麟高级服务器操作系统实际案例分享】数据库资源重启现象分析及处理全过程
更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…...
C#中泛型的协变和逆变
协变: 在泛型接口中,使用out关键字可以声明协变。这意味着接口的泛型参数只能作为返回类型出现,而不能作为方法的参数类型。 示例:泛型接口中的协变 假设我们有一个基类Animal和一个派生类Dog: csharp复制 public…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-附录B-严格模式
附录B、严格模式 严格模式 ECMAScript 5 首次引入严格模式的概念。严格模式用于选择以更严格的条件检查 JavaScript 代码错误,可以应用到全局,也可以应用到函数内部。严格模式的好处是可以提早发现错误,因此可以捕获某些 ECMAScript 问题导致…...
跨平台 C++ 程序崩溃调试与 Dump 文件分析
前言 C 程序在运行时可能会由于 空指针访问、数组越界、非法内存访问、栈溢出 等原因崩溃。为了分析崩溃原因,我们通常会生成 Dump 文件(Windows 的 .dmp,Linux 的 core,macOS 的 .crash),然后用调试工具分…...
缺陷VS质量:为何软件缺陷是质量属性的致命对立面?
为何说缺陷是质量的对立面? 核心逻辑:软件质量的定义是“满足用户需求的程度”,而缺陷会直接破坏这种满足关系。 对立性:缺陷的存在意味着软件偏离了预期行为(如功能错误、性能不足、安全性漏洞等)&#…...
伍[5],伺服电机,电流环,速度环,位置环
电流环、速度环和位置环是电机控制系统中常见的三个闭环控制环节,通常采用嵌套结构(内环→外环:电流环→速度环→位置环),各自负责不同层级的控制目标。以下是它们的详细说明及相互关系: 1. 电流环(最内环) 作用:控制电机的电流,间接控制输出转矩(τ=Kt⋅Iτ=Kt⋅…...
RuntimeError: CUDA error: device-side assert triggered
RuntimeError: CUDA error: device-side assert triggered 欢迎来到英杰社区,这里是博主英杰https://bbs.csdn.net/topics/617804998 原因: cuda运行可能是异步的(asynchronously),因此报错信息中提示的位置可能不准确…...
清华大学Deepseek第六版AIGC发展研究3.0(共186页,附PDF下载)
人工智能生成内容(AIGC)正以前所未有的速度改变我们的生活。 2024年底,清华大学新闻与传播学院与人工智能学院联合发布了《AIGC发展研究3.0版》,这份报告系统梳理了AIGC技术的突破性进展、应用场景及社会影响,并展望了…...
SpringBoot生成唯一ID的方式
1.为什么要生成唯一ID? 数据唯一性:每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行,并有助于准确地查询、更新或删除特定的记录。 数据完整性:通过使用唯一ID,可以保证数据库中的数…...
通俗易懂的分类算法之K近邻详解
通俗易懂的分类算法之K近邻详解 用最通俗的语言和例子,来彻底理解 K近邻(K-Nearest Neighbors,简称 KNN) 这个分类算法。不用担心复杂的数学公式,我会用生活中的例子来解释,保证你一听就懂! 1.…...
CSDN markdown 操作指令等
CSDN markdown 操作指令等 页内跳转 [内容](#1) <div id"1"> </div>...
【linux】文件与目录命令 - uniq
文章目录 1. 基本用法2. 常用参数3. 用法举例4. 注意事项 uniq 命令用于过滤文本文件中相邻的重复行,并支持统计重复次数或仅保留唯一行。它通常与 sort 命令配合使用,因为 uniq 只识别相邻的重复行。 1. 基本用法 语法: uniq [选项] [输入…...
零信任沙箱:为网络安全筑牢“隔离墙”
在数字化浪潮汹涌澎湃的今天,网络安全如同一艘船在波涛汹涌的大海中航行,面临着重重挑战。数据泄露、恶意软件攻击、网络钓鱼等安全威胁层出不穷,让企业和个人用户防不胜防。而零信任沙箱,就像是一座坚固的“隔离墙”,…...
【金融量化】Ptrade中交易环境支持的业务类型
1. 普通股票买卖 • 特点: 普通股票买卖是最基础的交易形式,投资者通过买入和卖出上市公司的股票来获取收益。 ◦ 流动性高:股票市场交易活跃,买卖方便。 ◦ 收益来源多样:包括股价上涨的资本利得和公司分红。 ◦ 风险…...
【Java---数据结构】链表 LinkedList
1. 链表的概念 链表用于存储一系列元素,由一系列节点组成,每个节点包含两部分:数据域和指针域。 数据域:用于存储数据元素 指针域:用于指向下一个节点的地址,通过指针将各个节点连接在一起,形…...
紧跟 Web3 热潮,RuleOS 如何成为行业新宠?
Web3 热潮正以汹涌之势席卷全球。从金融领域的创新应用到供应链管理的变革,从社交媒体的去中心化尝试到游戏产业的全新玩法探索,Web3 凭借其去中心化、安全性和用户赋权等特性,为各个行业带来了前所未有的机遇。在这股热潮中,Rule…...
CC++的内存管理
目录 1、C/C内存划分 C语言的动态内存管理 malloc calloc realloc free C的动态内存管理 new和delete operator new函数和operator delete函数 new和delete的原理 new T[N]原理 delete[]的原理 1、C/C内存划分 1、栈:存有非静态局部变量、函数参数、返回…...
Spark核心之02:RDD、算子分类、常用算子
spark内存计算框架 一、目标 深入理解RDD弹性分布式数据集底层原理掌握RDD弹性分布式数据集的常用算子操作 二、要点 ⭐️1. RDD是什么 RDD(Resilient Distributed Dataset)叫做**弹性分布式数据集,是Spark中最基本的数据抽象,…...
【Resis实战分析】Redis问题导致页面timeout知识点分析
事故现象:前端页面返回timeout 事故回溯总结一句话: (1)因为大KEY调用量,随着白天自然流量趋势增长而增长,最终在业务高峰最高点期占满带宽使用100%。   (2&#x…...
离散数学自然推理系统通关秘籍:从零开始手把手教你搞定Educoder所有证明题
离散数学自然推理系统通关秘籍:从零到精通的实战指南 1. 自然推理系统入门基础 对于初次接触离散数学自然推理系统的学习者来说,那些复杂的符号和规则往往让人望而生畏。但请记住,每个专家都曾是初学者。自然推理系统本质上是一种形式化的逻…...
1Remote终极指南:如何快速管理所有远程连接
1Remote终极指南:如何快速管理所有远程连接 【免费下载链接】1Remote One Remote Access Manager to Rule Them All 项目地址: https://gitcode.com/gh_mirrors/1r/1Remote 1Remote是一款现代化的个人远程会话管理器,专为IT专业人士和开发者设计&…...
Embulk高级用法指南:如何实现高效并行处理与数据分片
Embulk高级用法指南:如何实现高效并行处理与数据分片 【免费下载链接】embulk Embulk: Pluggable Bulk Data Loader. 项目地址: https://gitcode.com/gh_mirrors/em/embulk Embulk是一个强大的可插拔批量数据加载器,专为高效处理大规模数据迁移而…...
自动化 Vue 3 转 React 编译工具 VuReact 连续迭代,全量编译速度提升 30%-40%
近期,自动化 Vue 3 转 React 编译工具 VuReact 完成 v1.8.0、v1.8.1、v1.8.3 连续迭代,围绕性能、稳定性、开发体验深度优化,降低 Vue 项目向 React 迁移门槛。更新聚焦三大方向本轮更新围绕性能、稳定性、开发体验三大方向进行深度优化。尤其…...
OpenClaw 环境搭建|可视化操作零门槛
📌 OpenClaw 一键安装包|一键部署,告别复杂环境配置 适配系统:Windows10/11 64 位当前版本:v2.7.5(虾壳云版) ⭐ 核心优势 全程可视化操作,无需命令行、无需手动配置 Python/Node…...
用Tableau分析酒店数据:手把手教你做地区均价条形图和价格等级饼图
用Tableau分析酒店数据:手把手教你做地区均价条形图和价格等级饼图 酒店行业的数据分析往往需要快速洞察不同地区的价格分布和消费层级特征。作为全球领先的商业智能工具,Tableau能以直观的可视化方式呈现这些关键指标。本文将带你从零开始,用…...
Fast-GitHub:智能网络优化架构解析与分布式加速方案
Fast-GitHub:智能网络优化架构解析与分布式加速方案 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 在国内开发者面临G…...
3.1 FiRa UCI规范解析——命令、响应与通知的交互逻辑
1. FiRa UCI规范的核心交互机制 第一次接触FiRa UCI规范时,我被它严谨的消息交互设计所震撼。这个看似简单的命令-响应机制,实际上蕴含着UWB通信的精妙控制逻辑。就像交通信号灯指挥车辆通行一样,UCI规范通过明确的指令流向和状态反馈&#…...
Linux命令行玩转CAN总线:像查日志一样用grep分析candump实时数据流
Linux命令行玩转CAN总线:像查日志一样用grep分析candump实时数据流 在Linux系统管理领域,日志分析是每个开发者都熟悉的日常操作。当面对CAN总线这样的专业数据流时,其实可以运用同样的思维——将candump视为持续输出的数据源,用g…...
NoSQL数据库原理与应用
NoSQL数据库原理与应用 1. 技术分析 1.1 NoSQL概述 NoSQL数据库是对传统关系型数据库的补充: NoSQL类型文档型: MongoDB键值型: Redis列族型: Cassandra图数据库: Neo4jNoSQL特点:非关系型分布式水平扩展1.2 NoSQL vs 关系型 对比维度数据模型: 灵活vs结构化一致性:…...
