单调栈:数据存储顺序单调递增或单调递减
解决适用问题:左边和右边比当前小(大)且最近的。
力扣可以使用单调栈题目:
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]
是如上所述的 下一个更大元素 。
示例 1:
输入:nums1 = [4,1,2], nums2 = [1,3,4,2]. 输出:[-1,3,-1] 解释:nums1 中每个值的下一个更大元素如下所述: - 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。 - 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。 - 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
示例 2:
输入:nums1 = [2,4], nums2 = [1,2,3,4]. 输出:[3,-1] 解释:nums1 中每个值的下一个更大元素如下所述: - 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。 - 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。
题解:
- class Solution {
- public int[] nextGreaterElement(int[] nums1, int[] nums2) {
- if (nums1==null||nums2==null){
- return null;
- }
- int[] res = new int[nums1.length];
- int[] result = new int[nums2.length];
- //使用单调栈找出nums2数组元素之后第一个比它大的元素
- Stack
stack = new Stack<>(); - // 递减栈
- for (int i= nums2.length-1; i>=0; i--) {
- while (!stack.isEmpty()&&stack.peek()<=nums2[i]){
- stack.pop();
- }
- result[i] = stack.isEmpty()? -1:stack.peek();
- stack.push(nums2[i]);
- }
- // 返回数组结果赋值
- for (int i = 0; i < nums1.length; i++) {
- for (int j = 0; j < nums2.length; j++) {
- if (nums1[i]==nums2[j]){
- res[i]=result[j];
- break;
- }
- }
- }
- return res;
- }
- }
请根据每日
气温
列表temperatures
,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0
来代替。
示例 1:
输入:temperatures = [73,74,75,71,69,72,76,73] 输出: [1,1,4,2,1,1,0,0]
示例 2:
输入: temperatures = [30,40,50,60] 输出: [1,1,1,0]
题解:
- class Solution {
- public int[] dailyTemperatures(int[] temperatures) {
- if (temperatures==null){
- return null;
- }
- int[] res = new int[temperatures.length];
- int[] result = new int[temperatures.length];
- //使用单调栈找出nums2数组元素之后第一个比它大的元素
- Stack
stack = new Stack<>(); - for (int i = temperatures.length-1; i >=0; i--) {
- while (!stack.isEmpty()&&temperatures[stack.peek()]<=temperatures[i]){
- stack.pop();
- }
- result[i] = stack.isEmpty()?0:stack.peek();
- stack.push(i);
- }
-
- for (int i = 0; i < temperatures.length; i++) {
- res[i] = (result[i]-i)<0?0:result[i]-i;
- }
- return res;
- }
- }
给定一个循环数组
nums
(nums[nums.length - 1]
的下一个元素是nums[0]
),返回nums
中每个元素的 下一个更大元素 。数字
x
的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出-1
。
示例 1:
输入: nums = [1,2,1] 输出: [2,-1,2] 解释: 第一个 1 的下一个更大的数是 2; 数字 2 找不到下一个更大的数; 第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
示例 2:
输入: nums = [1,2,3,4,3] 输出: [2,3,4,-1,4]
题解:
- class Solution {
- public int[] nextGreaterElements(int[] nums) {
- int n = nums.length;
- int length = n*2-1;
- int[] res = new int[nums.length];
- Arrays.fill(res,-1);
- Stack
stack = new Stack<>(); - for (int i = 0; i < length; i++) {
- while (!stack.isEmpty()&&nums[stack.peek()]
- res[stack.pop()] = nums[i%n];
- }
- stack.add(i%n);
- }
- return res;
- }
- }