LeetCode 84. 柱状图中最大的矩形
题目链接:84. 柱状图中最大的矩形 - 力扣(LeetCode)
和接雨水还挺像的。
代码:
#python
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
heights.insert(0, 0)
heights.append(0)
stack = [0]
result = 0
for i in range(1, len(heights)):
while stack and heights[i] < heights[stack[-1]]:
mid_height = heights[stack[-1]]
stack.pop()
if stack:
# area = width * height
area = (i - stack[-1] - 1) * mid_height
result = max(area, result)
stack.append(i)
return result
/Java
class Solution {
public int largestRectangleArea(int[] heights) {
int MAX = 0;
int [] left = new int[heights.length], right = new int[heights.length];
for (int i = 0; i < left.length; ++i) left[i] = -1;
for (int i = 0; i < right.length; ++i) right[i] = heights.length;
LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < heights.length; ++i) {
while (!list.isEmpty() && heights[i] < heights[list.peekLast()]) {
right[list.pollLast()] = i;
}
list.offerLast(i);
}
list.clear();
for (int i = heights.length - 1; i >= 0; --i) {
while (!list.isEmpty() && heights[i] < heights[list.peekLast()]) {
left[list.pollLast()] = i;
}
list.offerLast(i);
}
for (int i = 0; i < heights.length; ++i) {
MAX = Math.max(MAX, (right[i] - left[i] - 1) * heights[i]);
}
return MAX;
}
}