代码随想录算法训练营天 第九章 五十九天| 503.下一个更大元素II 42. 接雨水
503.下一个更大元素II
class Solution {
public int[] nextGreaterElements(int[] nums) {
if (nums.length == 1) {
return new int[]{-1};
}
int len = nums.length;
int[] result = new int[len];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < len; i++) {
result[i] = -1;
}
for (int i = 0; i < len*2; i++) {
while (!stack.isEmpty() && nums[i%len] > nums[stack.peek()]) {
result[stack.peek()] = nums[i%len];
stack.pop();
}
stack.push(i%len);
}
return result;
}
}
42. 接雨水
class Solution {
public int trap(int[] height) {
int len = height.length;
int[] leftHeight = new int[len];
int[] rightHeight = new int[len];
leftHeight[0] = height[0];
for (int i = 1; i < len; i++) {
leftHeight[i] = Math.max(height[i], leftHeight[i-1]);
}
rightHeight[len - 1] = height[len-1];
for (int i = len-2; i >= 0; i--) {
rightHeight[i] = Math.max(height[i], rightHeight[i+1]);
}
int sum = 0;
for (int i = 0; i < len-1; i++) {
int count = Math.min(rightHeight[i],leftHeight[i]) - height[i];
if (count > 0) {
sum += count;
}
}
return sum;
}
}
class Solution {
public int trap(int[] height) {
int len = height.length;
Stack<Integer> stack = new Stack<>();
stack.push(0);
int sum = 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();
stack.push(i);
} else {
while (!stack.isEmpty() && height[i] > height[stack.peek()]) {
int num = stack.peek();
stack.pop();
if (!stack.isEmpty()) {
int h = Math.min(height[stack.peek()],height[i]) - height[num];
int m = i - stack.peek() -1;
sum += h*m;
}
}
stack.push(i);
}
}
return sum;
}
}