当前位置: 首页 > news >正文

算法单调栈—Java版

单调栈

  • 概念:维护栈中元素的单调性,单调增或者单调减。

  • 什么时候用?

    • 要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。单调栈的本质是空间换时间,在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。
  • 如何用?

    • 当要求数组的每个元素的下一个最大元素时,维护单调递减栈,每次遇到栈顶元素<新进栈元素时,栈顶元素出栈,如果出栈了新的栈顶还是小于新进栈元素,则一直循环出栈进栈,新元素进栈,此时出栈的元素的右边第一个最大元素为新进栈元素。如果新进栈元素<栈顶元素时,则直接进栈。例如有数组 [3,5,1,4,8,3]的对应元素的下一个最大元素为[5,8,4,8,-1,-1],-1表示没有。维护单调递减栈 s=[] ,首先3进栈,s=[3],然后新进栈元素为5,比栈顶元素大,5进栈,3出栈,此时s=[5],即3右边第一个比它大的元素为5,然后是1比栈顶5小直接进栈,s=[5,1];然后遇见4,此时1出栈,4进栈,即第一个比1大的元素是4 ,s=[5,4]。

    • 总结:找第一个/下一个最大元素,维护递减栈;找第一个/下一个最小元素,维护递增栈。

LeetCode练习

import java.util.ArrayDeque;
public class Solution {public String removeDuplicateLetters(String s) {//使用单调栈保持字典序ArrayDeque<Character> stack = new ArrayDeque<Character>();int length = s.length();stack.addLast(s.charAt(0));StringBuffer res = new StringBuffer();for(int i=1;i<length;i++){int flag = 0;Character c = stack.getLast();String sub = s.substring(i,length);while (c>s.charAt(i) && !stack.contains(s.charAt(i)) && sub.contains(""+c) && !stack.isEmpty()){//栈顶元素大于待检测字符且栈中没有该元素,且栈顶元素后续还有 且栈非空 则出栈stack.pollLast();if(!stack.isEmpty())c = stack.getLast();flag = 1;}if(flag==1){// 出栈完成后,待检测字符入栈stack.addLast(s.charAt(i));}if(!stack.contains(s.charAt(i))){  //c<s.charAt(i) &&// 如果待检测字符小于c且栈中不包含它则直接进栈stack.addLast(s.charAt(i));}}while(!stack.isEmpty()){Character c = stack.pollLast();res.append(c);}return res.reverse().toString();}
}
http://www.lryc.cn/news/19375.html

相关文章:

  • 在Linux中进行rocketmq及rocketmq控制台安装与配置
  • 2023年全国最新食品安全管理员精选真题及答案4
  • es-07脚本查询
  • JM员工福利与健康平台,企业关怀Always Online
  • 如何使用U-Mail搭建企业邮件服务器?
  • 用规则来搭建团队:写周报不一定是坏事
  • Apollo使用方法
  • 科研快讯 | 14篇论文被信号处理领域顶级国际会议ICASSP录用
  • 设计模式—策略(Strategy)模式
  • STM32 触摸屏移植GUI控制控件
  • 数仓模型之维度建模
  • Servlet笔记(9):Cookie处理
  • 骨传导耳机是怎么传声的,选择骨传导耳机的时候需要注意什么?
  • 达梦数据库DSC集群部署
  • java 系列之Mybatis
  • OBS 进阶 之 摄像头操作
  • Linux操作系统基础知识命令参数详解
  • Rust中一些K/V存储引擎
  • 202302-第四周资讯
  • 九方财富冲刺上市:付费用户开始减少,退款金额飙升至4.9亿元
  • SSM+HTML搭建(小白教学)
  • 【知识蒸馏】知识蒸馏(Knowledge Distillation)技术详解
  • 公司新招了个腾讯5年经验的测试员,让我见识到什么才是真正的测试天花板····
  • (一维、二维)数组传参,(一级、二级)指针传参【含样例分析,新手易懂】
  • for循环中的setTimeout以及var let作用域
  • 有限差分法求解不可压NS方程
  • Android入门第66天-使用AOP
  • pl/sql篇之触发器
  • 黑马《数据结构与算法2023版》正式发布
  • Spring的创建和使用