您现在的位置是:首页 >学无止境 >代码随想录算法训练营第五十九天|单调栈 part2网站首页学无止境
代码随想录算法训练营第五十九天|单调栈 part2
简介代码随想录算法训练营第五十九天|单调栈 part2
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。
数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/next-greater-element-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int[] nextGreaterElements(int[] nums) {
int len = nums.length;
int[] res = new int[len];
Arrays.fill(res,-1);
Deque<Integer> stack = new LinkedList<>();
// stack.push(0);
// 下一个更大元素->栈头到栈尾单调递增
// 2*len 循环数组,把这个数组拼接一下
for(int i=0;i<2*len;i++){
// if(nums[i]<=nums[stack.peek()]){
// stack.push(i);
// }else{
// }
while(!stack.isEmpty()&&nums[i%len]>nums[stack.peek()]){
res[stack.peek()] = nums[i%len];
stack.pop();
}
stack.push(i%len);
}
return res;
}
}
给定
n
个非负整数表示每个宽度为1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水
- 情况一:当前遍历的元素(柱子)高度小于栈顶元素的高度 height[i] < height[st.top()]
- 情况二:当前遍历的元素(柱子)高度等于栈顶元素的高度 height[i] == height[st.top()]
- 情况三:当前遍历的元素(柱子)高度大于栈顶元素的高度 height[i] > height[st.top()]
class Solution {
public int trap(int[] height) {
if(height.length<=2){
return 0;
}
Stack<Integer> stack = new Stack<Integer>();
// 栈头到栈尾从小到大的顺序
stack.push(0);
int sum=0;
for(int i=1;i<height.length;i++){
if(height[i]<height[stack.peek()]){
// 情况1直接入栈
stack.push(i);
}else if(height[i]==height[stack.peek()]){
// 因为相等的相邻墙,左边一个是不可能存放雨水的,所以pop左边的index, push当前index
stack.pop();
stack.push(i);
}else{
int stackTop = stack.peek();
while (!stack.isEmpty() && (height[i] > height[stackTop])){
// mid是凹槽底部
int mid = stack.pop();
if (!stack.isEmpty()){
int left = stack.peek();
// 左右墙最小高度减去凹槽高度
int h = Math.min(height[left], height[i]) - height[mid];
int w = i - left - 1;
int hold = h * w;
if (hold > 0) sum += hold;
stackTop = stack.peek();
}
}
stack.push(i);
}
}
return sum;
}
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。