LeetCode——栈

特点: 先进后出,后进先出

适合: 相当于一个暂存的地方,方便回来找

特: 单调栈——需要找到左边或者右边第一个比当前位置数大或者小的数字

数据类型

LinkedList<T> stack = new LinkedList<>();
addFirst==push;removeFirst==pop;peek// 面向接口编程,封装性更好
Deque<T> stack = new ArrayDeque<>();
addLast==push;pollLast==pop;peekLast

1.有效的括号20简单

class Solution {public boolean isValid(String s) {// 使用Java中的LinkedList创建栈,遍历s,如果和栈顶元素匹配则弹出,如果不匹配则压入;遍历结束后,如果列表为空,说明字符串是有效的,反之无效// 注意:Java中定义集合如果集合元素是基本数据类型,要使用他们的包装类;String不是数组,没有索引// 改进:使用哈希map将括号存起来,不用这么多if条件// 1. 进行一些特殊情况的判断int len = s.length();// 如果字符串长度是奇数,说明不是有效字符串if (len % 2 != 0) {return false;}// 2. 定义栈_Java中定义集合如果集合元素是基本数据类型,要使用他们的包装类LinkedList<Character> stack = new LinkedList<>();// 3. 开始遍历字符串for (int i = 0; i < len; i++) {if (stack.size() == 0 || s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '[') {stack.addFirst(s.charAt(i));} else {char temp = stack.removeFirst();if ((temp == '(' && s.charAt(i) == ')') || (temp == '{' && s.charAt(i) == '}') || (temp == '[' && s.charAt(i) == ']')) {continue;} else {return false;}}}if (stack.size() == 0) {return true;}return false;}
}

简单题补充:

1047删除字符串中的所有相邻重复项]

class Solution {public String removeDuplicates(String s) {// 思路:遍历字符串s,将字符串中的字符压入栈中,最后将栈中元素弹出并翻转,得到最终字符串// 压栈:栈为空或栈顶元素与遍历到的元素不相等// 出栈:栈顶元素与遍历到的元素相等// 1. 定义一个栈Deque<Character> stack = new ArrayDeque<>();// 2. 遍历for (int i = 0; i < s.length(); i++) {if (stack.isEmpty()) {stack.addLast(s.charAt(i));continue;}if (stack.peekLast() == s.charAt(i)) {stack.pollLast();} else {stack.addLast(s.charAt(i));}}// 3. 定义结果字符串,为了方便翻转,定义StringBuilderStringBuilder result = new StringBuilder();while (!stack.isEmpty()) {result.append(stack.pollLast());}return result.reverse().toString();}
}

150. 逆波兰表达式求值

class Solution {public int evalRPN(String[] tokens) {// 思路:定义一个栈,如果是数字压入栈中,如果是运算符,弹出两个数字,计算之后将结果压入栈中,最后遍历结束,栈中存在的最后一个值就是整个表达式的计算值// 注意:计算的时候弹出来的数计算要反过来!!!Deque<Integer> stack = new ArrayDeque<>();int n = tokens.length;for (int i = 0; i < n; i++) {String s = tokens[i];if (s.equals("+")) {int a = stack.pollLast();int b = stack.pollLast();stack.addLast(b + a);System.out.println("+" + stack.peekLast());} else if (s.equals("-")) {int a = stack.pollLast();int b = stack.pollLast();stack.addLast(b - a);} else if (s.equals("*")) {int a = stack.pollLast();int b = stack.pollLast();stack.addLast(b * a);} else if (s.equals("/")) {int a = stack.pollLast();int b = stack.pollLast();stack.addLast(b / a);System.out.println("/" + stack.peekLast());} else {stack.addLast(Integer.parseInt(s));System.out.println(stack.peekLast());}}return stack.pollLast();}
}

2.最小栈155中等

特点:辅助栈的使用

// class MinStack {
//     public int minValue;  // 记录最小值
//     public LinkedList<Integer> stack;//     public MinStack() {
//         minValue = Integer.MAX_VALUE;
//         stack = new LinkedList<>();
//     }//     public void push(int val) {
//         if (val < minValue) {
//             minValue = val;
//         }
//         stack.addFirst(val);
//     }//     public void pop() {
//         int temp = stack.removeFirst();
//         // 如果没有弹出最小元素
//         if (temp != minValue) {
//             return;
//         } else {
//             // 如果弹出了最小元素
//             minValue = Integer.MAX_VALUE;
//             for (int x: stack) {
//                 if (x < minValue) {
//                     minValue = x;
//                 }
//             }
//         }
//     }//     public int top() {
//         int temp = stack.removeFirst();
//         stack.addFirst(temp);
//         return temp;
//     }//     public int getMin() {
//         return minValue;
//     }
// }// 使用辅助栈,也就是最小栈里面一致存放的是当前最小值;压入新元素,最小栈比较当前最小值和当前最小元素,插入最小
class MinStack {LinkedList<Integer> xStack;LinkedList<Integer> minStack;public MinStack() {xStack = new LinkedList<>();minStack = new LinkedList<>();minStack.push(Integer.MAX_VALUE);}public void push(int val) {xStack.push(val);minStack.push(Math.min(val, minStack.peek()));}public void pop() {xStack.pop();minStack.pop();}public int top() {return xStack.peek();}public int getMin() {return minStack.peek();}
}

3.每日温度739中等

单调栈的直接使用!!!

// class Solution {
//     public int[] dailyTemperatures(int[] temperatures) {
//         // 思路:单调栈,如果遍历到当前元素小于栈顶元素,压栈;如果大于,不断弹出
//         LinkedList<Integer> indexStack = new LinkedList<>();
//         int len = temperatures.length;
//         int[] ans = new int[len];
//         // 遍历温度数组
//         for (int i = 0; i < len; i++) {
//             // 如果栈是空的
//             if (indexStack.isEmpty()) {
//                 indexStack.push(i);
//             } else {
//                 // 不为空,就要看栈顶元素和当前温度的大小
//                 if (temperatures[i] <= temperatures[indexStack.peek()]) {
//                     indexStack.push(i);
//                 } else {
//                     while (! indexStack.isEmpty()) {
//                         if (temperatures[i] > temperatures[indexStack.peek()]) {
//                             int temp = indexStack.pop();
//                             ans[temp] = i - temp;
//                         } else {
//                             break;
//                         }
//                     }
//                     indexStack.push(i);
//                 }
//             }
//         }
//         return ans;
//     }
// }// 简化
class Solution {public int[] dailyTemperatures(int[] temperatures) {// 思路:单调栈,如果遍历到当前元素小于栈顶元素,压栈;如果大于,不断弹出LinkedList<Integer> indexStack = new LinkedList<>();int len = temperatures.length;int[] ans = new int[len];// 遍历温度数组for (int i = 0; i < len; i++) {while (! indexStack.isEmpty()) {if (temperatures[i] > temperatures[indexStack.peek()]) {int temp = indexStack.pop();ans[temp] = i - temp;} else {break;}}indexStack.push(i);}return ans;}
}

4.柱状图中最大的矩形84困难

单调栈的反复使用!

class Solution {public int largestRectangleArea(int[] heights) {// 思路:遍历每根柱子,找到左右两边第一个比它矮的,面积为(右-左)*min(高度最小)int n = heights.length;// 定义左右两个数组,分别保存左边和右边第一个比该位置小的下标int[] l = new int[n];int[] r = new int[n];// 初始填充Arrays.fill(l, -1);Arrays.fill(r, n);// 定义栈——辅助寻找第一个小于的元素Deque<Integer> stack = new ArrayDeque<>();// 从头到尾遍历,找到右边第一个小于该位置的下标for (int i = 0; i < n; i++) {while (! stack.isEmpty() && heights[stack.peekLast()] > heights[i]) {r[stack.pollLast()] = i;}stack.addLast(i);}// 从尾遍历到头,找到左边第一个不小于该位置的小标stack.clear();for (int i = n - 1; i >= 0; i--) {while (!stack.isEmpty() && heights[stack.peekLast()] > heights[i]) {l[stack.pollLast()] = i;}stack.addLast(i);}// 开始计算面积int maxVal = 0;for (int i = 0; i < n; i++) {maxVal = Math.max(maxVal, heights[i] * (r[i] - l[i] - 1));}return maxVal;}
}

[未完待续……]

总结: 定义栈、三个栈的基本操作

​ 单调栈!!加辅助空间!!

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

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

相关文章

ECharts配置个性化图表:圆环、立体柱状图

官网调试地址&#xff1a;调试 效果图&#xff1a; 配置&#xff1a; option {color: [#29BEFF, #A2DC00, #FFC400, #FF7F5C, #CA99FC],// 提示窗tooltip: {trigger: item,show: false},// 图例legend: {top: 5%,left: center,show: false},// 数据series: [{name: Access …

C++常用遍历算法---for_each、transform

C常用遍历算法—for_each、transform 1、for_each—遍历容器 1.1 内置数据类型 void print1(int num) {cout << "这个数字是&#xff1a;" << num << endl; }void test1() {vector<int> numList;for (int i 0; i < 10; i){numList.pu…

LM393典型应用Multisim仿真设计

一、LM393简介: LM393是由两个独立的、高精度电压比较器组成的IC。LM393失调电压低,最大为2.0mv。可以是单电源供电,也可以是双电源供电,供电电压范围比较宽,电源功耗比较低。 LM393主要应用于限幅器、简单的模数转换器、脉冲发生器、方波发生器、延时发生器、宽频…

微同城生活源码系统:专业搭建本地生活服务平台 附带完整的安装部署教程

随着移动互联网的普及&#xff0c;人们越来越依赖手机进行日常生活中的各种活动&#xff0c;包括购物、餐饮、娱乐等。而传统的本地生活服务平台往往存在着功能单一、用户体验差等问题&#xff0c;无法满足用户日益增长的需求。因此&#xff0c;开发一款功能强大、易用性强的本…

获取 Linux 系统中所有网络命名空间的路由表

获取 Linux 系统中所有网络命名空间的路由表 以下是一个获取 Linux 系统中所有网络命名空间的路由表的 Bash 脚本示例&#xff1a; #!/bin/bash# 获取当前系统中所有网络命名空间的列表 ns_list$(ip netns list | awk {print $1})# 循环遍历每个网络命名空间 for ns in $ns_l…

css文本溢出处理——单行、多行

日常开发中&#xff0c;经常会遇到需要展示的文本过长&#xff0c;这种情况下&#xff0c;为了提高用户的使用体验&#xff0c;最常见的处理方式就是把溢出的文本显示成省略号。 处理文本的溢出的方式&#xff1a;1&#xff09;单行文本溢出&#xff1b; 2&#xff09;多行文本…

TikTok未来十年:平台发展的前瞻性思考

TikTok&#xff0c;作为全球短视频平台的领军者&#xff0c;已经在数字时代崭露头角。然而&#xff0c;随着技术的飞速发展和用户需求的变化&#xff0c;TikTok未来十年的发展前景充满了挑战和机遇。本文将深入探讨TikTok未来的发展方向&#xff0c;从技术、内容、社交和商业等…

SQL是什么?它有什么功能和特性?它值不值得我们去学习?我们该如何去学习呢?

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的标准化语言。它是一种专门用于查询、操作和管理数据库的语言&#xff0c;可以用于创建、修改和删除数据库中的数据表、索引和视图&#xff0c;以及执行数据查询、插入、更新和删除操作。 SQ…

OpenCV-Python(24):模板匹配

原理及介绍 模板匹配是一种常用的图像处理技术&#xff0c;它用于在一幅图像中寻找与给定模板最匹配的区域(在一副大图中搜寻查找模版图像位置的方法)。模板匹配的基本思想是将模板图像在目标图像上滑动&#xff0c;并计算它们的相似度&#xff0c;找到相似度最高的位置即为匹配…

2024款HarmonyOS教程 Next_HarmonyOS4鸿蒙OS最新入门实战全套教程

IT营大地老师2024款HarmonyOS视频教程重磅来袭&#xff01;视频 课件 源码等配套资料均可免费下载学习&#xff08;网盘下载地址&#xff1a;最新HarmonyOS系列教程下载地址-IT营大地老师--更新中&#xff09; 2024新出HarmonyOS Next_HarmonyOS4鸿蒙OS视频教程目录介绍&#…

LeetCode做题总结 15. 三数之和(未完)

不会做&#xff0c;参考了代码随想录和力扣官方题解&#xff0c;对此题进行整理。 代码思路 思想&#xff1a;利用双指针法&#xff0c;对数组从小到大排序。先固定一个数&#xff0c;找到其他两个。 &#xff08;1&#xff09;首先对数组从小到大排序。 &#xff08;2&…

2024史上最全的 iOS 各种测试工具集锦!

引言&#xff1a; 随着移动互联网的兴起&#xff0c;APP 测试的越来越被重视&#xff01;Android 系统因为自己的开源性&#xff0c;测试工具和测试方法比较广为流传&#xff0c;但是 iOS 系统的私密性&#xff0c;导致很多测试的执行都有点麻烦。 为了帮助大家更好的执行 iO…

Axure鲜花速递商城网站原型图,花店网站O2O本地生活电商平台

作品概况 页面数量&#xff1a;共 30 页 兼容软件&#xff1a;仅支持Axure RP 9/10&#xff0c;非程序软件无源代码 应用领域&#xff1a;鲜花网、花店网站、本地生活电商 作品特色 本作品为「鲜花购物商城」网站模板&#xff0c;高保真高交互&#xff0c;属于O2O本地生活电…

css设置图片左上角加文字

要在图片的左上角添加文字&#xff0c;可以使用CSS的position属性来定位文字元素&#xff0c;然后使用z-index属性来确保文字在图片上方显示。以下是示例CSS代码&#xff1a; css&#xff1a; .container {position: relative; }.text {position: absolute;top: 0;left: 0;z-…

香橙派--关于jammy-xfce-arm64.f12a43b3e629442a073a7236bf9166ce.tar.lz4的rootfs定制与镜像制作

使用 x64 的 Ubuntu22.04 电脑编译 Linux SDK&#xff0c;即 orangepi-build&#xff0c;支持在安装有 Ubuntu 22.04 的电脑上运行&#xff0c;所以下载 orangepi-build 前&#xff0c;请首先确保自己电脑已安装的 Ubuntu 版本是 Ubuntu22.04。查看电脑已安装的 Ubuntu 版本的命…

论文阅读--EFFICIENT OFFLINE POLICY OPTIMIZATION WITH A LEARNED MODEL

作者&#xff1a;Zichen Liu, Siyi Li, Wee Sun Lee, Shuicheng YAN, Zhongwen Xu 论文链接&#xff1a;Efficient Offline Policy Optimization with a Learned Model | OpenReview 发表时间&#xff1a; ICLR 2023年1月21日 代码链接&#xff1a;https://github.com/s…

什么是Maven ??? (以及关于依赖,中央仓库,国内源)

文章目录 什么是 Maven创建第一个 Maven 项目依赖管理Maven 的仓库Maven 如何设置国内源 什么是 Maven Maven &#xff1a;用于构建和管理任何基于java的项目的工具。**说白了就是管理 Java项目 的工具。**我们希望我们已经创建了一些东西&#xff0c;可以使Java开发人员的日常…

鸿蒙HarmonyOS- 弹框组件库

简介 今天介绍一个基于ArkUI框架开发的弹框组件库&#xff0c;该库基于ArkUI的弹框基础功能和自定义能力。针对通用的弹框业务场景&#xff0c;该库提供了丰富的组件弹窗功能。 包括确认输入弹窗、列表展示选择弹窗、自定义底部/顶部弹窗、自定义动画弹窗、自定义全屏弹窗、消息…

20.oracle保留小数或整数函数

oracle的函数主要有这几种 1、ceil(n)取整(大)&#xff0c;取比真值大的最小整数&#xff0c;注意正负数的取值&#xff1a; 如ceil(251.0001)252&#xff0c;ceil(-251.0001)-251&#xff0c;ceil(-251.9999)-251&#xff1b; select ceil(251.0000001) from dual; 结果&…

nginx访问路径匹配方法

目录 一&#xff1a;匹配方法 二&#xff1a;location使用: 三&#xff1a;rewrite使用 一&#xff1a;匹配方法 location和rewrite是两个用于处理请求的重要模块&#xff0c;它们都可以根据请求的路径进行匹配和处理。 二&#xff1a;location使用: 1&#xff1a;简单匹配…