[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;

    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pnpm+monorepo实现前端公共函数、组件库

一、前言 1. pnpm pnpm 是前端包管理工具之一&#xff0c;常见的还有npm、yarn等&#xff0c;但pnpm由于安装速度快、磁盘占用低、内置支持monorepo等优势&#xff0c;所以更推荐使用。 1-1 包管理工具核心特点对比 特性pnpmnpmyarn安装速度&#x1f680; 快&#xff08;基…

【计算机网络入门】初学计算机网络(八)

目录 1. S-W协议的信道利用率 2. GBN、SR协议的信道利用率 3.术语补充 3.1 滑动窗口协议 3.2 ARQ协议、连续ARQ协议 4. 信道划分介质访问控制 4.1 时分复用&#xff08;TDM&#xff09; 4.2 统计时分复用&#xff08;STDM&#xff09; 4.3 频分复用&#xff08;FDM&a…

JVM基本概念及内存管理模型

一、JVM基本概念 JVM&#xff08;Java Virtual Machine&#xff0c;Java 虚拟机&#xff09;是 Java 程序运行的核心组件。它负责将 Java 字节码转换为特定平台的机器指令&#xff0c;并提供内存管理、垃圾回收、安全性等功能。JVM 的主要功能包括以下&#xff1a; 加载和执行…

Docker 学习(三)——数据管理、端口映射、容器互联

一、数据管理 容器中的管理数据主要有两种方式&#xff1a; 数据卷 &#xff08;Data Volumes&#xff09;&#xff1a; 容器内数据直接映射到本地主机环境&#xff1b; 数据 卷容器&#xff08; Data Volume Containers&#xff09;&#xff1a; 使用特定容器维护数据卷 1.…

解锁Egg.js:从Node.js小白到Web开发高手的进阶之路

一、Egg.js 是什么 在当今的 Web 开发领域&#xff0c;Node.js 凭借其事件驱动、非阻塞 I/O 的模型&#xff0c;在构建高性能、可扩展的网络应用方面展现出独特的优势 &#xff0c;受到了广大开发者的青睐。它让 JavaScript 不仅局限于前端&#xff0c;还能在服务器端大展身手&…

我的ChatGPT怎么登不上?

近期&#xff0c;不少用户反馈在使用ChatGPT时遇到登录困难、连接超时等问题。本文将从技术角度分析常见原因&#xff0c;并提供合规、安全的解决方案&#xff0c;同时结合开发者实际需求推荐实用工具&#xff0c;助您高效应对登录障碍。 ChatGPT登录失败的常见原因 网络环境限…

小米手机如何录制屏幕?手机、电脑屏幕录制方法分享

大家最近有没有遇到想记录手机屏幕操作的情况&#xff1f; 比如精彩的游戏瞬间、有趣的视频教程&#xff0c;或者需要录制屏幕来制作演示材料。小米手机在这方面可是个好帮手&#xff0c;今天就来给你好好唠唠&#xff0c;小米手机如何录制屏幕&#xff0c;以及后续如何处理这…

【jenkins配置记录】

全局工具配置&#xff1a; D:\Program Files\Java\jdk1.8.0_281 D:\Program Files\Git\bin\git.exe E:\allure-2.13.2 2. GIT 3. 定时任务 H 8 * * 1-5 4. 构建触发器 5. 构建后操作 Allure Report 吐血记录&#xff1a;报告路径可以为 workspace 相对路径 6. 系统配置 em…

修改hosts文件,修改安全属性,建立自己的DNS

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

详解LSM树

目录 什么是LSM树 磁盘结构与顺序IO LSM树结构 LSM树的写入 SSTable合并 LSM树的读取 LSM树的删除 总结 什么是LSM树 LSM 树全名日志结构合并树&#xff08;Log-Structured Merge Tree&#xff09;&#xff0c;是一种用于存储和管理数据的树状数据结构&#xff0c;常用…

3d投影到2d python opencv

目录 cv2.projectPoints 投影 矩阵计算投影 cv2.projectPoints 投影 cv2.projectPoints() 是 OpenCV 中的一个函数&#xff0c;用于将三维空间中的点&#xff08;3D points&#xff09;投影到二维图像平面上。这在计算机视觉中经常用于相机标定、物体姿态估计、3D物体与2D图…

Spring Boot集成Minio笔记

一、首先配置MinIO 1、MinIO新建Bucket&#xff0c;访问控制台如图 创建访问密钥(就是账号和密码) 二、集成mino添加Minio客户端依赖 1.maven构建方式在pom.xml引入jar <dependency><groupId>io.minio</groupId><artifactId>minio</artifactI…

github进不去,一直显示错误

1、进入网址Dns检测|Dns查询 - 站长工具 2、复制检测出来的任意一个ip 3、打开电脑的文件夹&#xff1a;C:\Windows\System32\drivers\etc 下的hosts文件下复制这个ip地址 20.205.243.166 4、winr 打开cmd&#xff0c;输入ipconfig/flushdns ipconfig/flushdns出现这个就可以…

【商城实战(2)】商城架构设计:从底层逻辑到技术实现

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…

BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab

BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab 目录 BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab分类效果基本介绍BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测一、引言1.1、研究背景和意义1.2、研究现状1.3、研究目…

Windows下使用ShiftMediaProject方法编译FFmpeg

Windows SDK 8.1版本不支持dxva vp9! 需要10.0.17134.0&#xff01;或者把config编译选项去掉 1.下载源码 https://github.com/ShiftMediaProject 2.创建ShiftMediaProject文件夹 把下载好的源码放入source 3.进入SMP执行 project_get_dependencies.bat 自动下载ffmepg依赖项…

C++ Primer 动态数组

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

第四十一:Axios 模型的 get ,post请求

Axios 的 get 请求方式 9.双向数据绑定 v-model - 邓瑞编程 Axios 的 post 请求方式&#xff1a;

神经网络:AI的网络神经

神经网络&#xff08;Neural Networks&#xff09;是深度学习的基础&#xff0c;是一种模仿生物神经系统结构和功能的计算模型。它由大量相互连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;能够通过学习数据中的模式来完成各种任务&#xff0c;如图像分类、语音…

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式 2025/3/4 16:47 缘起&#xff1a;128GB的TF卡&#xff0c;只能格式化为NTFS/exFAT/ext4。 在飞凌的OK3588-C下&#xff0c;NTFS格式只读。 exFAT需要改内核来支持。 现在只剩下ext4了。 linux R4默认不支持exFAT…