【LeetCode】四、栈相关:有效的括号 + 下一个更大的元素

文章目录

  • 1、栈结构
  • 2、Java中的栈
  • 3、leetcode20:有效的括号
  • 4、leetcode496:下一个更大元素

1、栈结构

和队列相反,栈先进后出
在这里插入图片描述
时间复杂度:访问、插入、删除都在栈顶进行操作,时间复杂度为O(1),搜索需要遍历,为O(n)

在这里插入图片描述

2、Java中的栈

Stack类,继承关系:

在这里插入图片描述

常用操作与时间复杂度:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、leetcode20:有效的括号

在这里插入图片描述
解法思路:拿到字符串后,遍历,如果是左括号,则入栈,如果是右括号,则弹栈出来一个左括号。遍历完后,栈里有数据,说明左括号多了,不合规。中途出现栈里弹不出左括号的,说明右括号多了,也不合规。

在这里插入图片描述

代码实现:

public class P20 {

    public static boolean checkStr(String str) {
        if (str.length() == 0 || null == str) {
            return true;
        }
        //初始化一个栈
        Stack<String> stack = new Stack<>();
        String[] array = str.split("");
        for (String s : array) {
            //入栈左括号
            if ("(".equals(s) || "{".equals(s) || "[".equals(s)) {
                stack.push(s);
            } else {
                // 必须先左后右
                if (stack.size() == 0){
                    return false;
                } else {
                    // 入栈的是右括号,且之前栈里有左括号了,那就取栈顶
                    String temp = stack.pop();
                    // 如果是右圆括号,那栈帧必须是左圆括号,否则就是([)之类的
                    if (")".equals(s)) {
                        if (!"(".equals(temp)) {
                            return false;
                        }
                    }
                    if ("}".equals(s)) {
                        if (!"{".equals(temp)) {
                            return false;
                        }
                    }
                    if ("]".equals(s)) {
                        if (!"[".equals(temp)) {
                            return false;
                        }
                    }
                }
            }
        }
        return stack.isEmpty();
    }
}

测试:

public class P20 {
    public static void main(String[] args) {
        String str = "{}({[]})";
        System.out.println(checkStr(str));
    }
}

在这里插入图片描述

4、leetcode496:下一个更大元素

num1数组中有个4,在num2中找到4,其后面只有个2,没有比4更大的了,返回-1
在这里插入图片描述

根据这个特点:比较的是该元素在num2位置后面的元素有没有比该元素大的,如果采用栈,将num2入栈,遍历num1的每个元素n,每次弹出栈顶元素来比较,循环直到取到和元素n相等的值或者栈空时停止循环,如果一直没有取到更大的值,则返回-1。期间如果中途取到了更大的值,则存一下,以防有多个更大的值,下次出现更大的值,不论大小,直接覆盖,因为取的是下一个更大元素,不是下一个更大的元素里的最大的元素。每这样对比完num1的一个元素,就将结果写入要return的结果数组中。

在这里插入图片描述

每循环一次,处理num1的一个元素,num2的栈元素也会被弹出,等处理num1的下一个元素时,num2的栈就不完整了,因此,这里用一个tmp临时栈,记录num2栈被弹出的元素,后面再塞回num2栈,以便处理num1的下一个元素。

public class P496 {

    /**
     *
     * num1是num2的子集
     */
    public static int[] getNextMore (int[] num1, int[] num2) {
        // num1不是num2的子集,直接返回空
        if (num1 == null || num2 == null || num1.length > num2.length) {
            return null;
        }
        // num2数组转为栈
        Stack<Integer> stack = new Stack<>();
        for (int i : num2) {
            stack.push(i);
        }
        // 创建一个初始化数组存结果集
        int[] result = new int[num1.length];
        // 创建一个临时栈,存每轮找数被弹出来的num2的元素,一轮完成后,再从临时栈塞回num2的栈
        Stack<Integer> tempStack = new Stack<>();
        // 这里不用foreach,要用下标i存入结果集的对应位置
        for (int i = 0; i < num1.length; i++) {
            // 下一个更大值,默认-1,找到更大的了就覆盖
            int tempMore = -1 ;
            while (true) {
                Integer top = stack.pop();
                tempStack.push(top);
                if (top == num1[i] || stack.isEmpty()){
                    // 找到了或者num2栈弹完了
                    break;
                } else if (top > num1[i]) {
                    tempMore = top;
                }
            }
            // 找到了num1的一个元素的更大的值
            result[i] = tempMore;
            // 获取到某个元素的下一个更大值后,把弹栈的数据再塞回去,准备下一轮循环再处理num1的下一个元素了
            while (!tempStack.isEmpty()) {
                stack.push(tempStack.pop());
            }
        }
        return result;
    }
}

测试:

public class P496 {
    public static void main(String[] args) {
        int[] num1 = {4, 1, 2};
        int[] num2 = {1, 3, 4, 2};
        for (int i : getNextMore(num1, num2)) {
            System.out.print(i + " ");
        }
    }
}

在这里插入图片描述

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

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

相关文章

技术分享:分布式数据库DNS服务器的架构思路

DNS是企业数字化转型的基石。伴随微服务或单元化部署的推广&#xff0c;许多用户也开始采用分布式数据库将原来的单体数据库集群服务架构拆分为大量分布式子服务集群&#xff0c;对应不同的微服务或服务单元。本文将从分布式数据库DNS服务器的架构需求、架构分析两方面入手&…

2.用BGP对等体发送路由

2.用BGP对等体发送路由 实验拓扑&#xff1a; 实验要求&#xff1a;用BGP对等体发送路由信息 实验步骤&#xff1a; 1.完成基本配置&#xff08;略&#xff09; 2.建立BGP对等体&#xff08;略&#xff09; 3.创建路由信息&#xff08;用创建一个loop back接口就能产生一个直连…

【java】【控制台】【javaSE】 初级java家教管理系统控制台命令行程序项目

更多项目点击&#x1f446;&#x1f446;&#x1f446;完整项目成品专栏 【java】【控制台】【javaSE】 初级java家教管理系统控制台命令行程序项目 获取源码方式项目说明&#xff1a;功能点数据库涉及到&#xff1a; 项目文件包含&#xff1a;项目运行环境 &#xff1a;截图其…

HarmonyOS Next开发学习手册——弹性布局 (Flex)

概述 弹性布局&#xff08; Flex &#xff09;提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。常用于页面头部导航栏的均匀分布、页面框架的搭建、多行数据的排列等。 容器默认存在主轴与交叉轴&#xff0c;子元素默认沿主轴排列&#xff0c;子元素在主轴…

网络流-EK算法(保姆级教学)

本文引用董晓算法的部分图片。 一些不能带入纸质资料的竞赛&#xff0c;网络流纳入考纲。 因为需要默写&#xff0c;想来也不会考默写dinic这种算法难倒大家&#xff0c;只需要快速敲对EK算法就行了。 EK算法能在O(n*m^2)的复杂度内解决最大流问题&#xff0c;其中最大流就是…

Flutter循序渐进==>封装、继承、多态、抽象类以及属性修改

导言 新学一门编程语言&#xff0c;最难以理解的莫过于类了。如果类没用&#xff0c;也就算了&#xff0c;它偏偏很有用&#xff0c;我们必须得掌握&#xff0c;不然怎么好意思说自己会面向对象编程呢? 抽象类&#xff08;Abstract Class&#xff09;在面向对象编程中扮演着…

如何看待AIGC中漫画版权争议?( 计育韬老师高校公益巡讲答疑实录2024)

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声&#xff0c;互动答疑环节往往反映了高校师生当前最普遍的运营困境&#xff0c;特此计老师在现场即兴答疑之外&#xff0c;会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

java 操作 milvus 2.1.4

1. 确认 docker 运行的 milvus容器镜像版本情况&#xff1a; 2. pom 依赖&#xff1a; <dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.1.0</version><exclusions><exclusi…

【秋招突围】2024届秋招笔试-科大笔试题-01-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 文章目录 &#x1f4d6…

在Tomcat中部署war包

1、准备war包 确保已经有一个有效的war包&#xff0c;该war包包含了web应用程序的所有内容&#xff1b; 2、停止tomcat服务器 在部署之前&#xff0c;确保tomcat服务器已经停止&#xff0c;进入tomcat的配置目录执行命令&#xff1a;[路径]/tomcat/conf&#xff1b; 在Linux…

前端vite+vue3——利用环境变量和路由区分h5、pc模块打包(从0到1)

⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 前端vitevue3——利用环境变量和路由对前端区分h5和pc模块打包&#xff08;从0到1&#xff09;。 背景&#xff1a; 前端本地开发pc和h5的项目&#xff0c;发布时需要区分开h5和pc的页面 vite Vite 通过在一开始将应…

论文阅读--《FourierGNN:从纯图的角度重新思考多元时间序列预测》

Yi K, Zhang Q, Fan W, et al. FourierGNN: Rethinking multivariate time series forecasting from a pure graph perspective[J]. Advances in Neural Information Processing Systems, 2024, 36. 本次介绍的文章来自NeurIPS 2023&#xff0c;关于多变量时间序列的预测 摘要…

CocosCreator构建IOS的wwise教程

CocosCreator构建IOS教程 添加wwise教程: 1.添加include 2.添加SoundEngine 3.添加Profile-iphoneos下面lib下面的.a 4.导入js调用C++的文件 5.导入这些文件 6.初始化ios绝对路径和TTS语音合成对象 6.获得根目录绝对路径,加载pck需要找到绝对路径。怎么找绝对路径? #impor…

现如今软考通过率真的很低吗?

刚开始机考&#xff0c;10个人中有3个人表示想要尝试考试&#xff0c;这样通过率能高吗&#xff1f;就拿PMP证书来说吧&#xff0c;一下子就得花费三千多块&#xff0c;有几个人会轻易去尝试呢&#xff1f; 说到底&#xff0c;考试的难度是一个方面&#xff0c;考试的成本低是…

vue3日历选择器

倒叙日历&#xff1a; <template><div class"date-picker"><div class"column" wheel"onYearScroll"><div v-for"(year, index) in displayedYears" :key"index" :class"{current: year current…

深度解析RocketMq源码-消费者索引ConsumeQueue

1.绪论 rocketmq的broker中关于消息持久化的组件主要包含三个&#xff0c;分别是&#xff1a;持久化消息到文件中的组件commitLog&#xff1b;根据消息key索引commitLog日志的indexFile&#xff1b;消费者根据topic和queueId查询commitLog日志的consumeQueue。前面已经介绍com…

Profibus协议转profinet协议网关模块连接电机保护器与PLC通讯

一、背景 工业通讯中常见的协议有&#xff1a;Modbus协议&#xff0c;ModbusTCP协议&#xff0c;Profinet协议&#xff0c;Profibus协议&#xff0c;Profibus DP协议&#xff0c;EtherCAT协议&#xff0c;EtherNET协议等在现代工业控制系统中具有重要的角色。而Profibus协议转…

智慧数据中心可视化:高效管理与直观监控的未来

随着数据中心的规模和复杂性不断增加&#xff0c;传统管理方式难以满足需求。智慧数据中心通过图扑可视化实现实时数据监控和智能分析&#xff0c;将复杂的基础设施直观呈现&#xff0c;极大提升了运维效率、故障排查速度和资源优化能力&#xff0c;为企业提供现代化、智能化的…

mac app应用程序如何自定义图标, 更换.app为自己喜欢的图标或者图片 详细图文讲解

在mac系统中&#xff0c;我们可以对任何的app应用程序更换或者自定义图标&#xff0c; 这个图标可以是拥有的app的图标&#xff0c;或者是你自己制作的 x.icns 图标 或者是 任意的图片&#xff0c; 建议大小512x512 。 自定义图标方法如下&#xff1a; 1. 更换为已有app的图标…

词向量模型

文章目录 RNN词向量模型模型整体框架训练数据构建CBOW与Skip-gram模型负采样 RNN 卷积神经网络&#xff08;CNN&#xff09;主要应用计算机视觉&#xff0c;而递归神经网络&#xff08;RNN&#xff09;主要应用于自然语言处理。 递归神经网络会涉及处理之前所有的数据&#x…