42. 接雨水
单调栈法:
class Solution {
public int trap(int[] height) {
int size = height.length;
if (size <= 2) return 0;
Stack<Integer> stack = new Stack<Integer>();
stack.push(0);
int sum = 0;
for(int i = 1;i < size;i++){
if(height[stack.peek()] >= height[i]){
stack.push(i);
}else if(height[stack.peek()] == height[i]){
stack.pop();
stack.push(i);
}else{
while(!stack.isEmpty() && height[stack.peek()] < height[i]){
int mid = stack.peek();
stack.pop();
if(!stack.isEmpty()){
int left = stack.peek();
int right = i;
int w = right - left - 1;
int h = Math.min(height[left] - height[mid],height[right] - height[mid]);
sum += w * h;
}
}
stack.push(i);
}
}
return sum;
}
}
最优解:
双指针法
class Solution {
public int trap(int[] height) {
int left = 0;
int right = height.length - 1;
int l_max = 0;
int r_max = 0;
int result = 0;
while(left <= right){
l_max = Math.max(l_max,height[left]);
r_max = Math.max(r_max,height[right]);
if(l_max < r_max){
result += l_max - height[left];
left++;
}else{
result += r_max - height[right];
right--;
}
}
return result;
}
}
84.柱状图中最大的矩形
单调栈法:
class Solution {
public int largestRectangleArea(int[] heights) {
int[] newHeights = new int[heights.length + 2];
newHeights[0] = 0;
newHeights[newHeights.length-1] = 0;
for(int i = 1;i < newHeights.length - 1;i++){
newHeights[i] = heights[i-1];
}
Stack<Integer> stack = new Stack<>();
stack.push(0);
int result = 0;
for(int i = 1;i < newHeights.length;i++){
if(newHeights[stack.peek()] < newHeights[i]){
stack.push(i);
}else if(newHeights[stack.peek()] == newHeights[i]){
stack.pop();
stack.push(i);
}else{
while(!stack.isEmpty() && newHeights[stack.peek()] > newHeights[i]){
int mid = stack.peek();
stack.pop();
if(!stack.isEmpty()){
int left = stack.peek();
int right = i;
int w = i - left - 1;
int h = newHeights[mid];
result = Math.max(result,w * h);
}
}
stack.push(i);
}
}
return result;
}
}