leetcode11 & leetcode84 柱状图的最大面积 & 盛最多水的容器
import java.util.Stack;
public class 柱状图的最大面积84 {
//柱状图的最大面积,单调栈(最近小于)
public static int largestRectangleArea(int[] heights) {
if (heights == null || heights.length == 0) return 0;
int maxArea = 0;
//单调栈,存储index
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < heights.length; i++) {
while (!stack.isEmpty() && heights[i] <= heights[stack.peek()]) {
int j = stack.pop();
int k = stack.isEmpty() ? -1 : stack.peek();
int curArea = (i - k - 1) * heights[j]; //i - k - 1就是出栈index所能覆盖的最长长度
maxArea = Math.max(maxArea,curArea);
}
stack.push(i);
}
while(!stack.isEmpty()){
int j = stack.pop();
int k = stack.isEmpty() ? -1 : stack.peek();
int curArea = (heights.length - k - 1) * heights[j]; //这里仍未出栈 栈顶元素是数组最后一个元素
maxArea = Math.max(curArea,maxArea);
}
return maxArea;
}
//11盛最多水的容器 可以用单调栈做吗(最近大于最近小于,这里应该是最远大于)?
//双指针法 权衡底长和高度之间的关系,从最大底长开始,用更长的高来权衡底长的缩短
public static int maxArea(int[] height) {
int max = 0;
int l = 0;
int r = height.length - 1;
while (l < r) {
max = Math.max((r - l) * Math.min(height[l], height[r]), max);
if(height[l] < height[r]){
l++;
}else{
r--;
}
}
return max ;
}
public static void main(String[] args) {
int[] heights = {1,8,6,2,5,4,8,3,7};
int i = maxArea(heights);
System.out.println(i);
}
}