
单调栈
文章平均质量分 59
Guapifang
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode 2104. 子数组范围和 --单调栈
子数组范围和给你一个整数数组 nums 。nums 中,子数组的 范围 是子数组中最大元素和最小元素的差值。返回 nums 中 所有 子数组范围的 和 。子数组是数组中一个连续 非空 的元素序列。示例 1:输入:nums = [1,2,3]输出:4解释:nums 的 6 个子数组如下所示:[1],范围 = 最大 - 最小 = 1 - 1 = 0[2],范围 = 2 - 2 = 0[3],范围 = 3 - 3 = 0[1,2],范围 = 2 - 1 = 1[2,3],范围 = 3 .原创 2022-03-04 13:56:37 · 265 阅读 · 0 评论 -
LeetCode 1019. 链表中的下一个更大节点--单调栈
链表中的下一个更大节点给出一个以头节点 head 作为第一个节点的链表。链表中的节点分别编号为:node_1, node_2, node_3, … 。每个节点都可能有下一个更大值(next larger value):对于 node_i,如果其 next_larger(node_i) 是 node_j.val,那么就有 j > i 且 node_j.val > node_i.val,而 j 是可能的选项中最小的那个。如果不存在这样的 j,那么下一个更大值为 0 。返回整数答案数组 a.原创 2021-10-08 13:03:31 · 125 阅读 · 0 评论 -
LeetCode 795. 区间子数组个数--单调栈
区间子数组个数给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。例如 :输入:A = [2, 1, 4, 3]L = 2R = 3输出: 3解释: 满足条件的子数组: [2], [2, 1], [3].注意:L, R 和 A[i] 都是整数,范围在 [0, 10^9]。数组 A 的长度范围在[1, 50000]。题解利用单调栈找出每个元素在区间[L,R]内最大,于是在这区间取值.原创 2021-08-25 20:22:21 · 231 阅读 · 1 评论 -
LeetCode 1856. 子数组最小乘积的最大值--单调栈+前缀和
子数组最小乘积的最大值一个数组的 最小乘积 定义为这个数组中 最小值 乘以 数组的 和 。比方说,数组 [3,2,5] (最小值是 2)的最小乘积为 2 * (3+2+5) = 2 * 10 = 20 。给你一个正整数数组 nums ,请你返回 nums 任意 非空子数组 的最小乘积 的 最大值 。由于答案可能很大,请你返回答案对 109 + 7 取余 的结果。请注意,最小乘积的最大值考虑的是取余操作 之前 的结果。题目保证最小乘积的最大值在 不取余 的情况下可以用 64 位有符号整数 保存.原创 2021-08-11 22:51:07 · 396 阅读 · 0 评论 -
LeetCode1673. 找出最具竞争力的子序列--单调栈
找出最具竞争力的子序列给你一个整数数组 nums 和一个正整数 k ,返回长度为 k 且最具 竞争力 的 nums 子序列。数组的子序列是从数组中删除一些元素(可能不删除元素)得到的序列。在子序列 a 和子序列 b 第一个不相同的位置上,如果 a 中的数字小于 b 中对应的数字,那么我们称子序列 a 比子序列 b(相同长度下)更具 竞争力 。 例如,[1,3,4] 比 [1,3,5] 更具竞争力,在第一个不相同的位置,也就是最后一个位置上, 4 小于 5 。示例 1:输入:nums = [3,.原创 2021-06-01 13:45:46 · 925 阅读 · 0 评论 -
LeetCode 321. 拼接最大数--贪心+单调栈
拼接最大数给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。说明: 请尽可能地优化你算法的时间和空间复杂度。示例 1:输入:nums1 = [3, 4, 6, 5]nums2 = [9, 1, 2, 5, 8, 3]k = 5输出:[9,.原创 2021-04-15 14:36:45 · 383 阅读 · 0 评论 -
LeetCode 316. 去除重复字母--贪心策略+单调栈
去除重复字母给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同示例 1:输入:s = “bcabc”输出:“abc”示例 2:输入:s = “cbacdcbc”输出:“acdb”提示:1 <= s.length .原创 2021-02-21 13:31:50 · 262 阅读 · 0 评论 -
LeetCode503. 下一个更大元素 II--单调栈
下一个更大元素 II给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例 1:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。注意: 输入数组的长度不会超过 1000.原创 2021-02-09 12:42:48 · 140 阅读 · 0 评论 -
LeetCode 739. 每日温度--单调栈
每日温度请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。题解很明显的单调栈题目,意思是求.原创 2021-02-09 12:03:31 · 122 阅读 · 0 评论 -
单调栈模板代码C++
单调栈的用处很多,特别是在数组区间的题目中,比如告诉你一组高低不同的矩阵求最大面积,等等。简单理解就是:单调栈算法可以在接近O(n)的时间复杂度告诉你一个数组arrs中,得到每个元素arrs[i]的左右区间[L[i],R[i]],在区间L[i]到R[i]中,元素arrs[i]为最小的元素(也可以是最大的元素)。比如数组:3、1、2、6、4以求最小的情况为例:在区间[0,0]之间,3最小;在区间[0,4]之间,1最小;在区间[2,4]之间,2最小;在区间[3,3]之间,6最小;在区间[3,4]原创 2021-02-08 23:15:46 · 319 阅读 · 0 评论 -
LeetCode 85. 最大矩形--单调栈+前缀和
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。示例 1:输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]输出:6解释:最大矩形如上图所示。示例 2:输入:matrix = []输出:0示例 3:输入:matrix = [[“0”]]输出:0示例 4:输入:原创 2021-02-08 22:53:25 · 170 阅读 · 0 评论 -
LeetCode 907. 子数组的最小值之和--单调栈+闭区间和开区间处理
题解:很明确可以看出来就是找某个数字A[i]作为最小值时,左边能延申位置X,右边能延申到位置Y,然后答案ans+=A[i] x (i-X+1) x (Y-i+1);这个很好理解了吧,就是找到A[i]作为最小值的区间个数,那么有个问题,比如1 2 1的数据,1和1重复了,如果按照把A[i]作为最小值处理,第一个1的左右位置就是:1和3,第3个1的左右位置就是1和3。那么答案就错了,因为两个区间相互包含了,这里的最小值是闭区间的最小值,于是我们考虑到,我们针对于左边的元素,找到的是小于等于A[i]的A[X],右原创 2020-10-17 23:53:11 · 182 阅读 · 0 评论