栈——算法专项刷题(六)

news2025/7/18 22:32:44

六、栈

6.1后缀表达式

原题链接

根据 逆波兰表示法,求该后缀表达式的计算结果。

有效的算符包括 +-*/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:

  • 整数除法只保留整数部分。
  • 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 1:

  • 输入:tokens = [“2”,“1”,“+”,“3”,“*”]

  • 输出:9

  • 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

提示:

1 <= tokens.length <= 10^4
tokens[i] 要么是一个算符("+"、"-"、"*" 或 "/"),要么是一个在范围 [-200, 200] 内的整数

思路:栈的基本使用,是数值就压栈,是运算符就弹出两个数值

注意点:数值可能为负,如果字符串第一个字符是 - 可能是负数也可能是 减法运算,通过字符串长度进行判断


class Solution {
    public int evalRPN(String[] tokens) {



        Stack<Integer> stack = new Stack<>();
        int n = tokens.length;

        for (int i = 0; i < n; i++) {
            char c = tokens[i].charAt(0);
            if(c >= '0' && c <='9' || (c == '-' && tokens[i].length() > 1)){
                stack.push(Integer.valueOf(tokens[i]));
            }else {
                int num1 = stack.pop();
                int num2 = stack.pop();
                if (c == '+') {
                    stack.push(num2 + num1);
                }else if(c == '-'){
                    stack.push(num2 - num1);
                }else if( c == '/'){
                    int num = num2 / num1;
                    stack.push(num);
                }else{
                    int num = num2 * num1;
                    stack.push(num);
                }
            }
            
        }
        
        

return stack.pop();


    }
}

6.2小行星碰撞

原题链接

给定一个整数数组 asteroids,表示在同一行的小行星。

对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。

找出碰撞后剩下的所有小行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。

示例 1:

  • 输入:asteroids = [5,10,-5]

  • 输出:[5,10]

  • 解释:10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞。

提示:

  • 2 <= asteroids.length <= 10^4
  • -1000 <= asteroids[i] <= 1000
  • asteroids[i] != 0

解法一:栈

思路: 使用栈来模拟碰撞可能,只有一个正数 一个负数 这种顺序才能发生碰撞

注意点: 当前数值为负可以一直和栈中小的正数碰撞

class Solution {
    public int[] asteroidCollision(int[] asteroids) {


        int n = asteroids.length;
        Stack<Integer> stack = new Stack<>();

        for (int i = 0; i < n; i++) {

            // 栈为空或者 当前值大于 0 压栈
            if(stack.isEmpty() || asteroids[i] > 0){
                stack.push(asteroids[i]);
                continue;
            }

            int cur = - asteroids[i];

      // 栈顶的值为正数,大于当前值 消除
      while(!stack.isEmpty() && stack.peek() > 0 && cur > stack.peek()){
            stack.pop();
      }

         // 栈不为空
      if(!stack.isEmpty()){
          // 相等 消除栈顶元素
          if(stack.peek() == cur) {
              stack.pop();
          }else if(stack.peek() < 0){
              //栈顶元素小于 0
              stack.push(asteroids[i]);
          }
      }else{
          stack.push(asteroids[i]);
      }
          


        }

        int size = stack.size();
        int[] ans = new int[size];

        for (int i = size - 1; i >= 0; i--) {
            ans[i] = stack.pop();
        }

        return ans;
    }
}

解法二:

思路: 模拟碰撞,使用一个alive标识表示当前小行星是否存在,当当前小行星为负、存在并且栈顶元素是大于0 且 小于 -aster 栈顶小行星爆炸

注意: 边界情况

class Solution {
    public int[] asteroidCollision(int[] asteroids) {
        Deque<Integer> stack = new ArrayDeque<Integer>();
        for (int aster : asteroids) {
            boolean alive = true;
            while (alive && aster < 0 && !stack.isEmpty() && stack.peek() > 0) {
                alive = stack.peek() < -aster; // aster 是否存在
                if (stack.peek() <= -aster) {  // 栈顶小行星爆炸
                    stack.pop();
                }
            }
            if (alive) {
                stack.push(aster);
            }
        }
        int size = stack.size();
        int[] ans = new int[size];
        for (int i = size - 1; i >= 0; i--) {
            ans[i] = stack.pop();
        }
        return ans;
    }
}

6.3 每日温度

每日温度

请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

  • 输入: temperatures = [73,74,75,71,69,72,76,73]
  • 输出: [1,1,4,2,1,1,0,0]

提示:

  • 1 <= temperatures.length <= 105
  • 30 <= temperatures[i] <= 100

思路: 单调栈,在栈中存数组下标,如果当前温度 > 栈顶下标对应的温度,弹栈并保存栈顶下标对应的 之后升温天数

注意点: 使用栈记录温度会不知道具体下标,因此直接 用下标代替栈

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {


        Stack<Integer> stack = new Stack<>();
        
        
        int n = temperatures.length;
        int[] res = new int[n];

        for (int i = 0; i < n; i++) {
            
            while(!stack.isEmpty() && temperatures[stack.peek()] < temperatures[i]){
                 
                res[stack.peek()] = i - stack.peek();
                stack.pop();
                
            }
            stack.push(i);
        }


        return res;
    }
}

6.4 直方图最大矩形面积

原题链接

给定非负整数数组 heights ,数组中的数字用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

在这里插入图片描述

  • 输入:heights = [2,1,5,6,2,3]
  • 输出:10
  • 解释:最大的矩形为图中红色区域,面积为 10

提示:

  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104

思路: 对每个位置的数组值,如果左右指针指向的数组值 大于此位置的值,左指针向左移动,右指针向右移动

注意点: 在进行双指针移动前需要判断 是否需要进行移动,如果当前数组值 * 数组总长度 都不能大于 max 那么双指针移动无意义,直接跳过此轮循环

class Solution {
    public int largestRectangleArea(int[] heights) {

        int max = 0;
        int left = 0;
        int right = 0;

        for(int i = 0; i < heights.length;i++){

            left = i -1;
            right = i+1;
            // 如果当前值 乘于 整个数组长度 都不能大于max,那么再进行双指针左右扩展也不能大于max
            if(heights.length * heights[i] > max){
                while (left >=0 && heights[left] >= heights[i]){
                    left--;
                }
                while(right < heights.length && heights[right] >= heights[i]){
                    right++;
                }
                
                max = Math.max(max, (right - left - 1) * heights[i]);
            }
        }


        return max;

    }
}

6.5矩阵中的最大矩形

原题链接

给定一个由 01 组成的矩阵 matrix ,找出只包含 1 的最大矩形,并返回其面积。

注意: 此题 matrix 输入格式为一维 01 字符串数组。

在这里插入图片描述

  • 输入:matrix = [“10100”,“10111”,“11111”,“10010”]
  • 输出:6
  • 解释:最大矩形如上图所示。

提示:

  • rows == matrix.length
  • cols == matrix[0].length
  • 0 <= row, cols <= 200
  • matrix[i][j] 为 '0' 或 '1'

思路:基本思路 是先遍历一遍数组,将每一行 所有元素的左侧连续1的个数进行统计,然后就是确定高度 找最大的宽度进行计算

详细参考leetcode官方题解链接

class Solution {
    public int maximalRectangle(String[] matrix) {
        int m = matrix.length;
        if (m == 0) {
            return 0;
        }
        int n = matrix[0].length();
        int[][] left = new int[m][n];

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i].charAt(j) == '1') {
                    // 统计每一行 连续 1的个数
                    left[i][j] = (j == 0 ? 0 : left[i][j - 1]) + 1;
                }
            }
        }

        int ret = 0;
        for (int j = 0; j < n; j++) { 
            
            int[] up = new int[m];
            int[] down = new int[m];

            Deque<Integer> stack = new ArrayDeque<Integer>();
            for (int i = 0; i < m; i++) {
                while (!stack.isEmpty() && left[stack.peek()][j] >= left[i][j]) {
                    stack.pop();
                }
                up[i] = stack.isEmpty() ? -1 : stack.peek();
                stack.push(i);
            }
            stack.clear();
            for (int i = m - 1; i >= 0; i--) {
                while (!stack.isEmpty() && left[stack.peek()][j] >= left[i][j]) {
                    stack.pop();
                }
                down[i] = stack.isEmpty() ? m : stack.peek();
                stack.push(i);
            }

            for (int i = 0; i < m; i++) {
                int height = down[i] - up[i] - 1;
                int area = height * left[i][j];
                ret = Math.max(ret, area);
            }
        }
        return ret;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【kafka】五、kafka工作流程

kafka工作流程 工作流程 kafka中消息是以topic进行分类的&#xff0c;生产者生产消息&#xff0c;消费者消费消息&#xff0c;都是面向topic的。 topic是逻辑上的概念&#xff0c;而partition是物理上的概念&#xff0c;每一个partition对应一个log文件&#xff0c;该log文件…

基建融资与预算软约束(2015年A股大牛市与“流动性堰塞湖”)-中国视角下的宏观经济

基建融资与预算软约束(2015年A股大牛市与“流动性堰塞湖”) – 潘登同学的宏观经济学笔记 文章目录基建融资与预算软约束(2015年A股大牛市与“流动性堰塞湖”) -- 潘登同学的宏观经济学笔记2015年A股大牛市定向宽松的货币政策导向定向宽松的货币政策原因投资项目的预算软约束政…

python基础之循环嵌套

文章目录一、break和continue二、while的循环嵌套知识点print:例题1打印星星&#xff1a;例题2打印九九乘法表一、break和continue break当某一条件满足时直接跳出当前循环&#xff1b; continue当某一条满足时&#xff0c;不执行后续循环重新开始新一轮循环&#xff1b; i1 …

[附源码]java毕业设计婴幼儿玩具共享租售平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

python基础之字典

文章目录一、字典1.dictionary(字典)2.和列表的区别&#xff1a;二、实例三、应用场景一、字典 1.dictionary(字典) 是除了列表之外最灵活的数据类型&#xff0c;字典同样可以用来存储多个数据&#xff08;通常用于存储描述一个物体的相关信息&#xff09;&#xff1b; 2.和…

数据分析软件的使用

一 数据分析概述 1 概念 数据分析是利用数学&#xff0c;统计学理论相结合的科学统计分析方法&#xff0c;对Excel数据&#xff0c;数据库中的数据&#xff0c;收集的大量数据&#xff0c;网页抓取的数据进行分析&#xff0c;从中提前有价值的信息并形成结论进行展示的过程。…

用于调整PID控制器增益的遗传算法的实现(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

第八章 兼容多种模块标准的软件包封装

第八章 如何封装兼容多种JS模块标准的软件包&#xff1f; 为了方便用户使用&#xff0c;一款成熟的类库都会提供多种模块封装形式&#xff0c;比如大家最常用到的 Vue&#xff0c;就提供了cjs、esm、umd 等多种封装模式&#xff0c;并且还会提供对应的压缩版本&#xff0c;方便…

Python异或运算符示例

目录 异或 异或的性质 示例1&#xff1a;值交换 示例2&#xff1a;找出现一次的元素 示例2代码&#xff1a; 异或 英文为exclusive OR&#xff0c;缩写成xor&#xff0c;符号是^ aba^b0假0假0假0假1真1真1真0假1真1真1真0假 异或的性质 1、a ^ a0 任何数字和自己异或结…

Java项目:JSP蛋糕甜品店管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;分为管理员与普通用户两种角色&#xff0c;管理员登录后台&#xff0c;普通用户登录前台&#xff1b; 管理员角色…

Zookeeper

文章目录Zk介绍特点数据结构应用场景Zk安装、集群下载、启动配置参数解读Zookeeper 集群操作选举机制&#xff08;面试重点&#xff09;客户端命令行操作客户端界面节点类型&#xff08;持久 / 短暂 / 有序号 / 无序号&#xff09;监听器1&#xff09;节点的值变化监听2&#x…

【通信】基于matlab模拟室内VLC模型(含BER和SNR)附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

短视频平台如何保证内容安全问题?

本文首发于&#xff1a;行者AI谛听 近些年&#xff0c;短视频的安全意识越来越强&#xff0c;随着各大平台的用户暴增&#xff0c;平台的一些审核及运营都有着巨大的挑战。那么对于平台来说&#xff0c;如何保证内容安全呢&#xff1f; 很多短视频平台的内容有着爆炸式的增长&a…

Vue3动态路由(Vite+Vue3+TS+Mock)

一、动态路由简介 Vue通过路由进行页面管理&#xff0c;不同的路由绑定到不同的页面。一般来说&#xff0c;前端直接写好的路由为静态路由&#xff0c;在不修改代码的情况下&#xff0c;路由表是不会改变的。对于不需要动态改变路由表的网站&#xff0c;静态路由就已经足够了&…

关于数据治理工具的选型,你了解多少?

数据治理的本质是盘点数据资产、治理数据质量&#xff0c;实施数据全生命周期的管理&#xff0c;这里面包括了建组织、立制度或者使用一款数据治理的软件帮助企业开展数据治理的相关工作等等。根据不同的数据治理项目特点&#xff0c;会用到不同的技术或工具。拥有一套趁手好用…

功率放大器的三种类型是什么意思

很多人都知道功率放大器&#xff0c;但是却不知道同样都是功率放大器&#xff0c;但是名字相同&#xff0c;作用却是完全不同的&#xff0c;总是会有工程师发出这样的疑问“功率放大器的三种类型是什么以及功率放大器怎么选择型号”等等&#xff0c;今天就请安泰电子来为我们解…

SpringBoot整合Alibaba-Dubbo和Apache-Dubbo

文章目录1 Alibaba整合Dubbo1.1 服务提供者1.1.1 服务提供者接口1.1.2 服务提供者实现类1.1.2.1 项目结构图1.1.2.2 pom.xml1.1.2.3 服务实现类1.1.2.4 配置文件1.1.2.5 启动类1.2 服务消费者1.2.1 项目结构图示1.2.2 请求入口1.2.3 配置文件1.2.4 启动类2 Apache整合Dubbo2.1 …

Pytorch学习笔记(四)官方60min入门教程之图像分类器

你已经了解了如何定义神经网络&#xff0c;计算损失值和网络里权重的更新。 现在你也许会想应该怎么处理数据&#xff1f; 通常来说&#xff0c;当你处理图像&#xff0c;文本&#xff0c;语音或者视频数据时&#xff0c;你可以使用标准 python 包将数据加载成 numpy 数组格式…

Web3中文|10月份超48%的以太坊NFT交易额是假的

来源 | cryptoslate 编译 | BoweniNFTnews.com 10月份全球NFT销售额超过8.5亿美元&#xff0c;总交易量约为300万笔。 NFT月销售额 数据来源&#xff1a;Footprint Analytics 在市场状况不佳的情况下&#xff0c;仍有大量唯一买家与卖家。10月份有超过100 万的唯一买家和卖家…

第九章 哈希表 AcWing 1532. 找硬币

第九章 哈希表 AcWing 1532. 找硬币 原题链接 AcWing 1532. 找硬币 算法标签 哈希表 双指针 思路 使用哈希表集合 用一个哈希表存储硬币。 对于每一枚硬币 x&#xff0c;判断在集合中是否存在 y&#xff0c;使得 x y m。 如果存在&#xff0c;则是一组解&#xff0c;判…