容器盛水问题:https://www.nowcoder.com/practice/31c1aed01b394f0b8b7734de0324e00f?tpId=117&&tqId=35269&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
11. 盛最多水的容器
class Solution {
public int maxArea(int[] height) {
int l = 0, r = height.length - 1;
int ans = 0;
while (l < r) {
int area = Math.min(height[l], height[r]) * (r - l);
ans = Math.max(ans, area);
if (height[l] <= height[r]) {
++l;
} else {
--r;
}
}
return ans;
}
}
84. 柱状图中最大的矩形
class Solution {
public int largestRectangleArea(int[] heights) {
int len = heights.length;
if (len == 0) {
return 0;
}
if (len == 1) {
return heights[0];
}
int Area = 0;
int[] newHeights = new int[len + 2];
for (int i = 0; i < len; i++) {
newHeights[i + 1] = heights[i];
}
len += 2;
heights = newHeights;
//栈中存放的是一个宽度的位置 当前位置的最高下标值
Deque<Integer> stack = new ArrayDeque<>();
stack.add(0);
for (int i = 1; i < len; i++) {
//当栈顶的元素大于当前的元素
while (heights[stack.peekLast()] > heights[i]) {
//栈顶的高度
int height = heights[stack.removeLast()];
//弹出栈
int width = i - stack.peekLast() - 1;
Area = Math.max(Area, width * height);
}
stack.add(i);
}
return Area;
}
}