单调栈概念:
从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈
- 单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小
- 单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大
—————————————————————————————
例题:
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
- 输入: [1,2,1]
- 输出: [2,-1,2]
解释:
第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
用单调栈求解,此处栈内记录的是 nums 元素的下标
直接将 nums 复制两倍
判断栈顶元素和当前元素的大小
若栈顶元素 > 当前元素:当前元素入栈
若栈顶元素 < 当前元素:弹出栈顶元素,并记录栈顶元素的下一个更大元素为当前元素
class Solution {
public int[] nextGreaterElements(int[] nums) {
int n=nums.length;
int[] max=new int[n];
Arrays.fill(max,-1);
Deque<Integer> stack = new LinkedList<Integer>();
for(int i=0;i<2*n-1;i++){
while(!stack.isEmpty()&&nums[stack.peek()]<nums[i%n]){
max[stack.pop()]=nums[i%n];
}
stack.push(i%n);
}
return max;
}
}
暴力解法:双重for循环…
class Solution {
public int[] nextGreaterElements(int[] nums) {
int n=nums.length;
int[] max=new int[n];
for(int i=0;i<n;i++){
for(int j=i+1;j<n+i+1;j++){
if(nums[i]<nums[j%n]){
max[i]=nums[j%n];
break;
}
if(j==n+i){
max[i]=-1;
}
}
}
return max;
}
}