503.下一个更大元素II
力扣题目链接
class Solution {
public int[] nextGreaterElements(int[] nums) {
int len = nums.length;
Deque<Integer> stack = new LinkedList<>();
int[] result = new int[len];
Arrays.fill(result,-1);
stack.push(0);
for(int i =1;i < len * 2;i++){
int j = i % len;
if(nums[j] <= nums[stack.peek()]){
stack.push(j);
}else{
while(!stack.isEmpty() && nums[j] > nums[stack.peek()]){
result[stack.peek()] = nums[j];
stack.pop();
}
stack.push(j);
}
}
return result;
}
}
42. 接雨水
力扣题目链接
class Solution {
public int trap(int[] height) {
//双指针法
// int sum = 0;
// int len = height.length;
// for(int i = 1;i < len - 1;i++){
// int right = i + 1;
// int left = i - 1;
// int rHighest = 0;
// int lHighest = 0;
// int min = 0;
// while(left >= 0){
// lHighest = lHighest > height[left] ? lHighest : height[left];
// left--;
// }
// while(right <= len - 1){
// rHighest = rHighest > height[right] ? rHighest : height[right];
// right++;
// }
// min = Math.min(rHighest,lHighest);
// if (min <= height[i])continue;
// sum += min - height[i];
// }
// return sum;
//单调栈
Deque<Integer> stack = new LinkedList<>();
int sum = 0;
int len = height.length;
stack.push(0);
for(int i = 1;i < len;i++){
if(height[i] < height[stack.peek()]){
stack.push(i);
}else if(height[i] == height[stack.peek()]){
stack.pop();// 因为相等的相邻墙,左边一个是不可能存放雨水的,所以pop左边的index, push当前的index
stack.push(i);
}else{
while(!stack.isEmpty() && height[i] > height[stack.peek()]){
int mid = stack.pop();
if(stack.isEmpty())break;
int high = Math.min(height[stack.peek()],height[i]) - height[mid];
int width = i - stack.peek() - 1;
sum += high * width;
}
stack.push(i);
}
}
return sum;
}
}