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

算法打卡:第十章 单调栈part01

今日收获:单调栈理论,每日温度,下一个更大元素Ⅰ,下一个更大元素Ⅱ

1. 单调栈理论(来自代码随想录)

应用场景:一维数组寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置

存放的元素:数组下标

递增还是递减:单调递增栈(从栈顶到栈底)求右边第一个比自己大的(遍历发现比自己大的元素);单调递减栈求右边第一个比自己小的(遍历的目的是发现比自己小的元素)

2. 每日温度

题目链接:739. - 力扣(LeetCode)

思路:用单调递增栈。如果当前元素比栈顶元素小,直接加入栈;反之记录结果,并不断弹出栈中比当前元素小的元素。

方法:

class Solution {public int[] dailyTemperatures(int[] temperatures) {int len=temperatures.length;Stack<Integer> stack=new Stack<>();int[] result=new int[len];stack.push(0);for (int i=1;i<len;i++){if (temperatures[i]<=temperatures[stack.peek()]){stack.push(i);  // 加入更小的元素}else{// 一直弹出比当前元素小的并记录while (!stack.isEmpty()&&temperatures[stack.peek()]<temperatures[i]){result[stack.peek()]=i-stack.peek();stack.pop();}stack.push(i);  // 加入当前下标}}return result;}
}

3. 下一个更大元素Ⅰ

题目链接:496. - 力扣(LeetCode)

思路:和每日温度差不多,只不过在遇到目标元素时,需要判断栈顶元素是否在nums1中。这需要利用map映射存储nums1的值和下标。存储值是为了快速判断当前值是否在nums1中,存储的下标对应结果数组的下标。

方法:

class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {int len1=nums1.length;int len2=nums2.length;int[] result=new int[len1];Arrays.fill(result,-1);  // 最后栈中留下的元素默认-1// 记录数组1中值和下标的对应关系,便于判断当前元素是否存在于nums1中,下标对应结果的下标HashMap<Integer,Integer> map=new HashMap<>();for (int i=0;i<len1;i++){  map.put(nums1[i],i);}// 求nums2中比当前元素大的右边第一个元素Stack<Integer> stack=new Stack<>();stack.push(0);for (int i=1;i<len2;i++){if (nums2[i]<=nums2[stack.peek()]){stack.push(i);}else {while (!stack.isEmpty()&&nums2[i]>nums2[stack.peek()]){if (map.containsKey(nums2[stack.peek()])){  // 收集结果int index=map.get(nums2[stack.peek()]);result[index]= nums2[i];}stack.pop();}stack.push(i);}}return result;}
}

总结:Arrays.fill(数组,填充值) 可以用于Java中数组的初始化。

4. 下一个更大元素Ⅱ

题目链接:503. - 力扣(LeetCode)

思路:遍历两倍长度的数组,求当前元素的值时将下标 i 取余数组长度,其余的思路和每日温度相同。

方法:

class Solution {public int[] nextGreaterElements(int[] nums) {int len=nums.length;Stack<Integer> stack=new Stack<>();int[] result=new int[len];Arrays.fill(result,-1);stack.push(0);for (int i=1;i<len*2;i++){if (nums[i%len]<=nums[stack.peek()]){stack.push(i%len);}else {while (!stack.isEmpty()&&nums[i%len]>nums[stack.peek()]){result[stack.peek()]=nums[i%len];stack.pop();}stack.push(i%len);}}return result;}
}

总结:循环都涉及到下标取余数组长度的操作。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 通过adb命令打开手机usb调试
  • Android Studio新建工程(Java语言环境)
  • 【建设方案】固定资产信息系统建设方案(功能清单列表2024word原件)
  • 9.12 TFTP通信
  • Leetcode面试经典150题-138.随机链表的复制
  • 构建“零工市场小程序”,服务灵活就业“大民生”
  • 2025年最新大数据毕业设计选题-基于Hive分析相关
  • 34.贪心算法1
  • STP 笔记
  • Village Exteriors Kit 中世纪乡村房屋场景模型
  • 【MySQL】MySQL中JDBC编程——MySQL驱动包安装——(超详解)
  • 探索人工智能的未来趋势
  • CI/CD持续集成和持续交付(git工具、gitlab代码仓库、jenkins)
  • 设计模式 桥接模式(Bridge Pattern)
  • Python数据分析工具(一):Requests的用法
  • 0基础学习移动端适配
  • EventListener原理
  • JavaScript新鲜事·第5期
  • JS字符串转数字方法总结
  • magento 货币换算
  • Next.js之基础概念(二)
  • SwizzleMethod 黑魔法
  • Vue 2.3、2.4 知识点小结
  • 简析gRPC client 连接管理
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端
  • 如何进阶一名有竞争力的程序员?
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 以太坊客户端Geth命令参数详解
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 阿里云ACE认证学习知识点梳理
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (6)设计一个TimeMap
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)VirtualBox安装增强功能
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .JPG图片,各种压缩率下的文件尺寸
  • .NET Framework杂记
  • .Net8 Blazor 尝鲜
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .Net小白的大学四年,内含面经
  • /*在DataTable中更新、删除数据*/
  • @GlobalLock注解作用与原理解析
  • [Android]Tool-Systrace
  • [BJDCTF2020]The mystery of ip1
  • [BZOJ] 2044: 三维导弹拦截
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子