今日任务
42. 接雨水
84.柱状图中最大的矩形
42. 接雨水
题目链接: . - 力扣(LeetCode)
class Solution {
public int trap(int[] height) {
if (height.length <= 2) return 0;
int sum = 0;
Stack<Integer> stack = new Stack<Integer>();
stack.push(0);
for (int i = 1; i < height.length; 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 mid = stack.pop();
if (!stack.isEmpty()) {
int left = stack.peek();
int h = Math.min(height[i], height[left]) - height[mid];
int w = i - left - 1;
sum += w * h;
}
}
}
stack.push(i);
}
return sum;
}
}
84.柱状图中最大的矩形
题目链接: . - 力扣(LeetCode)
class Solution {
public int largestRectangleArea(int[] heights) {
if (heights.length == 0) return 0;
if (heights.length == 1) return heights[0];
Stack<Integer> stack = new Stack<>();
int res = 0;
int[] newHeights = new int[heights.length + 2];
for (int i = 0; i < heights.length; i++) {
newHeights[i + 1] = heights[i];
}
stack.push(0);
for(int i = 1; i < newHeights.length; i++) {
if (newHeights[i] > newHeights[stack.peek()]) {
stack.push(i);
} else if (newHeights[i] == newHeights[stack.peek()]) {
stack.pop();
stack.push(i);
} else {
while (!stack.isEmpty() && newHeights[i] < newHeights[stack.peek()]){
int mid = stack.pop();
if (!stack.isEmpty()) {
int left = stack.peek();
int right = i;
res = Math.max(res, newHeights[mid] * (right - left - 1));
}
}
stack.push(i);
}
}
return res;
}
}