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

【代码随想录Day46】单调栈Part01

739. 每日温度

题目链接/文章讲解:代码随想录
视频讲解:单调栈,你该了解的,这里都讲了!LeetCode:739.每日温度_哔哩哔哩_bilibili
使用暴力方法会超出时间限制:

class Solution {public int[] dailyTemperatures(int[] temperatures) {int len = temperatures.length;int[] answer = new int[len];for (int i = 0; i < len; i++) {for (int j = i + 1; j < len; j++) {if (temperatures[j] > temperatures[i]) {answer[i] = j - i;break;}}}return answer;}
}

使用单调栈:

class Solution {// 定义一个方法 dailyTemperatures,输入一个整数数组 temperatures,返回一个整数数组public int[] dailyTemperatures(int[] temperatures) {int len = temperatures.length;  // 获取温度数组的长度Stack<Integer> stack = new Stack<>();  // 创建一个栈,用于存储温度的索引int[] answer = new int[len];  // 创建一个答案数组,用于存储每一天等待的天数// 遍历温度数组for (int i = 0; i < len; i++) {// 当栈不为空且当前温度大于栈顶索引对应的温度时while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {int idx = stack.pop();  // 弹出栈顶索引answer[idx] = i - idx;  // 计算当前温度比 idx 天的温度高的天数,并存入答案数组}stack.push(i);  // 将当前索引压入栈中}return answer;  // 返回答案数组}
}

496.下一个更大元素 I

题目链接/文章讲解:代码随想录
视频讲解:单调栈,套上一个壳子就有点绕了| LeetCode:496.下一个更大元素_哔哩哔哩_bilibili

class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {int len1 = nums1.length;int len2 = nums2.length;int[] count = new int[len1];Arrays.fill(count, -1);// 使用一个栈来帮助找到下一个更大元素Stack<Integer> stack = new Stack<>();// 用一个映射来存储 nums2 中每个元素的下一个更大元素HashMap<Integer, Integer> map = new HashMap<>();for (int j = 0; j < len2; j++) {// 当栈不为空且当前元素大于栈顶元素时,说明找到了下一个更大元素while (!stack.isEmpty() && nums2[j] > stack.peek()) {map.put(stack.pop(), nums2[j]); // 将该元素与下一个更大元素映射}stack.push(nums2[j]); // 将当前元素入栈}// 遍历 nums1,使用映射找到其下一个更大元素for (int i = 0; i < len1; i++) {if (map.containsKey(nums1[i])) {count[i] = map.get(nums1[i]); // 更新下一个更大元素}}return count;}
}

503.下一个更大元素 II

题目链接/文章讲解:代码随想录
视频讲解:单调栈,成环了可怎么办?LeetCode:503.下一个更大元素 II_哔哩哔哩_bilibili

public class Solution {// 方法:寻找数组中每个元素的下一个更大元素public int[] nextGreaterElements(int[] nums) {int len = nums.length; // 获取数组长度int[] result = new int[len]; // 创建结果数组,存储每个元素的下一个更大元素Arrays.fill(result, -1); // 初始化结果数组,默认为-1,表示没有更大元素// 创建一个栈来存储索引Stack<Integer> stack = new Stack<>();// 将数组扩展为两倍长度,以便于处理循环数组的情况int[] extendNums = new int[len * 2];for (int i = 0; i < len; i++) {extendNums[i] = nums[i]; // 复制原数组到扩展数组的前半部分extendNums[i + len] = nums[i]; // 复制原数组到扩展数组的后半部分}// 遍历扩展后的数组for (int i = 0; i < 2 * len - 1; i++) {// 当栈不为空且当前元素大于栈顶索引对应的元素时while (!stack.isEmpty() && extendNums[i] > extendNums[stack.peek()]) {int idx = stack.pop(); // 弹出栈顶元素的索引if (idx < len) { // 只有当弹出的索引属于原始数组时,才更新结果数组result[idx] = extendNums[i]; // 更新结果数组,记录下一个更大元素}}stack.push(i); // 将当前索引压入栈}return result; // 返回结果数组}
}

http://www.mrgr.cn/news/54245.html

相关文章:

  • [笔记] 关于CreateProcessWithLogonW函数创建进程
  • 在wpf 中 用mvvm 的方式 绑定 鼠标事件
  • 重置时把el-tree树节点选中状态取消
  • Linux:线程及其控制
  • xlnt加载excel报错:xl/workbook.xml:2:2581: error: attribute ‘localSheetId‘ expected
  • Code Review Item
  • 探索计算机技术的无限可能:从基础到前沿的深度之旅
  • PCL 点云配准 非线性加权最小二乘优化的点到面ICP算法(精配准)
  • 使用 NVBit 进行内存访问跟踪指南
  • 希尔(shell)排序
  • 深入理解Reactor核心概念
  • 【部署篇】RabbitMq-02单机模式部署
  • [H264]x264_encoder_headers函数
  • 第六十一周周报 MDSSSA-GNN
  • 计算机毕业设计Spark+大模型高考分数线预测 知识图谱高考志愿推荐系统 高考数据分析可视化 高考大数据 大数据毕业设计
  • 【洛谷】P1856
  • 【H2O2|全栈】WPS/Office系列有哪些好用的快捷方式?
  • Javaweb基础-axios
  • 学习虚幻C++开发日志——TSet
  • 推荐系统 # 二、推荐系统召回:协同过滤 ItemCF/UserCF、离散特征处理、双塔模型、自监督学习、多路召回、曝光过滤
  • MySQL 索引:优化数据库性能的关键
  • Java的重载和主要内存区
  • 开发工具(上)
  • [SAP ABAP] SE11定义数据类型(结构与表类型)
  • 模型轻量化1--模型剪枝
  • AI周报(10.13-10.19)