LeetCode 打卡day59--单调栈

一个人的朝圣 — LeetCode打卡第59-60天

  • 知识总结
  • Leetcode 739. 每日温度
    • 题目说明
    • 代码说明
  • Leetcode 496. 下一个更大元素 I
    • 题目说明
    • 代码说明
  • Leetcode 84. 柱状图中最大的矩形
    • 题目说明
    • 代码说明


知识总结

今天做了单调栈的三道题
总结了一个模版套路:

  1. 寻找下一个更大的数
for(int i = 0; i < len; i++){while(!stack.isEmpty() && nums[i] > nums[stack.peek()]{ans[nums.pop()] = nums[i];}stack.push(i);
}


Leetcode 739. 每日温度

题目链接

题目说明

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

在这里插入图片描述

代码说明

class Solution {public int[] dailyTemperatures(int[] temperatures) {//单调栈, 存放的数据如果比栈顶元素小, 直接存//如果比栈顶元素大,将小的元素弹出来, 并且记录下结果int[] res = new int[temperatures.length];Deque<Integer> stack = new LinkedList<>();stack.push(0);for(int i = 1; i < temperatures.length; i++){while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]){int index = stack.pop();res[index] = i - index;}stack.push(i);}return res;}
}

Leetcode 496. 下一个更大元素 I

题目链接

题目说明

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。
在这里插入图片描述

代码说明

这道题和上面的区别在于, 我们需要一个额外的Map 来储存value: index

class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {int len1 = nums1.length, len2 = nums2.length;int[] res = new int[len1];Arrays.fill(res, -1);Map<Integer, Integer> map = new HashMap<>();for(int i = 0; i < len1; i++){map.put(nums1[i], i);}LinkedList<Integer> stack = new LinkedList<>();stack.push(0);for(int i = 0; i < len2; i++){while(!stack.isEmpty() && nums2[i] > nums2[stack.peek()]){int index = stack.pop();if(map.containsKey(nums2[index])){res[map.get(nums2[index])] = nums2[i];}}stack.push(i);}return res;}
}

Leetcode 84. 柱状图中最大的矩形

题目链接

题目说明

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

在这里插入图片描述

代码说明

以前做过, 觉得很难, 现在明白了这个套路之后发现很简单.
我们需要两个数组, left, right.
left数组记录以当前高度的左边界, 也就是第一个小于当前高度柱子的index, 默认为-1
同理, right数组记录第一个小于当前数组柱子高度的index. 如果没有则为len

在这个例子中
如果heights = [2, 1, 5, 6, ,2 ,3]
left = [-1, -1, 1, 2, 1, 4]
right = [1, 6, 4, 4, 6, 6]

Area[i] = heights[i] * (right[i] - left[i] - 1)

class Solution {public int largestRectangleArea(int[] heights) {LinkedList<Integer> stack = new LinkedList<>();int len = heights.length;int[] left = new int[len];int[] right = new int[len];// 从左到右, 找到下一个比自己更小的Arrays.fill(right, len);for(int i = 0; i < len; i++){while(!stack.isEmpty() && heights[i] < heights[stack.peek()]){int index = stack.pop();right[index] = i;}stack.push(i);}// System.out.println(Arrays.toString(right));stack.clear();//从右向左遍历, 找到下一个比自己小的Arrays.fill(left, -1);for(int i =  len -1; i>=0;  i--){while(!stack.isEmpty() && heights[i] < heights[stack.peek()]){int index = stack.pop();left[index] = i;}stack.push(i);}// System.out.println(Arrays.toString(left));int res = 0;for(int i = 0; i < len; i++){res = Math.max(heights[i] * (right[i] - left[i] - 1), res);}return res;}
}

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

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

相关文章

冯诺依曼体系结构理解

冯诺依曼体系结构理解 1.介绍2.特点介绍3.举例说明4.注意 1.介绍 冯诺依曼体系结构&#xff08;Von Neumann Architecture&#xff09;是一种计算机体系结构&#xff0c;以数学家冯诺依曼&#xff08;John von Neumann&#xff09;的名字命名。它是一种经典的计算机设计范式&a…

使用Python爬虫和数据可视化,揭示人口大国历年人数的变迁

前言 人口大国通常在全球人口排名中位居前列&#xff0c;其人口数量远远超过其他国家。而印度和中国这两个国家的人口数量均已经超过14亿&#xff0c;而当前全球的人口总数也不过刚刚突破80亿而已&#xff0c;妥妥的天花板级别存在。或许是中国和印度在人口方面的表现太过“耀…

ContOS7 Oracle11g 安装配置

配置yum源 cd /etc mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak mkdir yum.repos.d wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 清理缓存 yum clean all # 建缓存 yum makecache #安装epel…

关于swagger突然跳转登录页面,swagger打开跳转login页面BUG

今天建了一个初始项目&#xff0c;引入swagger之后&#xff0c;启动调用&#xff0c;却总跳转到一个登录页面&#xff0c;手足无措 启动项目后&#xff0c;打开swagger进行测试&#xff0c;但是跳转到下图页面 最后原因是导入了security的包&#xff0c;导致权限安全拦截 注释…

短视频矩阵管理系统源码开发:视频批量剪辑,分发功能开发示例

短视频矩阵管理系统开发&#xff0c;首先对服务器要求&#xff1a; 源码所需服务器配置 1、规格&#xff1a;最低8核16G 2、硬盘&#xff1a;系统盘40-100G&#xff0c;数据盘不低于100G 3、带宽&#xff1a;10M 4、系统&#xff1a;CentOS7(务必选择7.*) 部署过程中&…

蓄电池风险监控,制造业必备!

在大型加工企业中&#xff0c;蓄电池被广泛应用于各种设备和系统&#xff0c;例如备用电源、起重设备、紧急照明等。蓄电池的可靠性和性能对于企业的正常运行至关重要。 因此&#xff0c;为了确保蓄电池的安全运行和有效管理&#xff0c;引入蓄电池监控系统成为必不可少的环节。…

100天精通Golang(基础入门篇)——第15天:深入解析Go语言中函数的应用:从基础到进阶,助您精通函数编程!(进阶)

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

SQL事务与隔离

事务 事务的定义 事务是完成一个任务的多条语句,这些语句中,只要有一条语句失败,那么整个事务就会失败,即使之前的语句已经执行完毕也会被撤回 举个例子: 我去银行给王哥转钱,这个转钱呢分两个步骤,第一步先把我的钱拿出来,第二步把钱给王哥,那万一刚把我钱拿出来但是没到王…

Swift与OC的混编

一些场面话 在一位前辈的博客里看到了关于iOS开发的各种语言的混编&#xff0c;浅浅学习一下怎么使用。不得不说语言混编的开发者是真的&#x1f42e;&#x1f37a; Swift中用OC混编 新建一个Swift文件 创建一个OC的类 选择language为OC 继续往下走&#xff0c;会跳出这个界…

css基础知识二十:说说对Css预编语言的理解?有哪些区别?

一、是什么 Css 作为一门标记性语言&#xff0c;语法相对简单&#xff0c;对使用者的要求较低&#xff0c;但同时也带来一些问题 需要书写大量看似没有逻辑的代码&#xff0c;不方便维护及扩展&#xff0c;不利于复用&#xff0c;尤其对于非前端开发工程师来讲&#xff0c;往…

【Spring Boot】Spring Boot日志详情:基于lombok的日志输出

文章目录 1. 何为日志文件&#xff1f;2. 日志文件的作用3. 日志文件的基本使用3.1 Spring Boot中的日志3.2 自定义日志打印 4 日志级别4.1 日志级别的作用4.2 日志级别的分类4.3 日志级别的设置 5 日志持久化6 基于lombok的日志输出6.1 lombok 简单输出日志案例6.2 浅谈 lombo…

【C++ OJ练习】7.字符串相加

1.题目链接 力扣 2.解题思路 拿到每个字符后 减去字符0 转化成对应的数字 再相加即可 倒着加 因为有进位的情况 最后头插或 者尾插加逆置 3.代码 class Solution { public:string addStrings(string num1, string num2) {//倒着往回加int end1 num1.size() - 1;int end2…