class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
}
};
84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10
示例 2:
输入: heights = [2,4] 输出: 4
提示:
1 <= heights.length <=105
0 <= heights[i] <= 104
相似题目
原站题解
golang 解法, 执行用时: 88 ms, 内存消耗: 10 MB, 提交时间: 2023-04-22 12:19:16
func largestRectangleArea(heights []int) int { n := len(heights) left, right := make([]int, n), make([]int, n) for i := 0; i < n; i++ { right[i] = n } mono_stack := []int{} for i := 0; i < n; i++ { for len(mono_stack) > 0 && heights[mono_stack[len(mono_stack)-1]] >= heights[i] { right[mono_stack[len(mono_stack)-1]] = i mono_stack = mono_stack[:len(mono_stack)-1] } if len(mono_stack) == 0 { left[i] = -1 } else { left[i] = mono_stack[len(mono_stack)-1] } mono_stack = append(mono_stack, i) } ans := 0 for i := 0; i < n; i++ { ans = max(ans, (right[i] - left[i] - 1) * heights[i]) } return ans } func max(x, y int) int { if x > y { return x } return y }
python3 解法, 执行用时: 244 ms, 内存消耗: 28 MB, 提交时间: 2023-04-22 12:18:48
class Solution: def largestRectangleArea(self, heights: List[int]) -> int: n = len(heights) left, right = [0] * n, [n] * n mono_stack = list() for i in range(n): while mono_stack and heights[mono_stack[-1]] >= heights[i]: right[mono_stack[-1]] = i mono_stack.pop() left[i] = mono_stack[-1] if mono_stack else -1 mono_stack.append(i) ans = max((right[i] - left[i] - 1) * heights[i] for i in range(n)) if n > 0 else 0 return ans
java 解法, 执行用时: 21 ms, 内存消耗: 57.9 MB, 提交时间: 2023-04-22 12:18:13
class Solution { public int largestRectangleArea(int[] heights) { int n = heights.length; int[] left = new int[n]; int[] right = new int[n]; Arrays.fill(right, n); Deque<Integer> mono_stack = new ArrayDeque<Integer>(); for (int i = 0; i < n; ++i) { while (!mono_stack.isEmpty() && heights[mono_stack.peek()] >= heights[i]) { right[mono_stack.peek()] = i; mono_stack.pop(); } left[i] = (mono_stack.isEmpty() ? -1 : mono_stack.peek()); mono_stack.push(i); } int ans = 0; for (int i = 0; i < n; ++i) { ans = Math.max(ans, (right[i] - left[i] - 1) * heights[i]); } return ans; } }
cpp 解法, 执行用时: 136 ms, 内存消耗: 79.4 MB, 提交时间: 2023-04-22 12:17:51
class Solution { public: int largestRectangleArea(vector<int>& heights) { int n = heights.size(); vector<int> left(n), right(n, n); stack<int> mono_stack; for (int i = 0; i < n; ++i) { while (!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) { right[mono_stack.top()] = i; mono_stack.pop(); } left[i] = (mono_stack.empty() ? -1 : mono_stack.top()); mono_stack.push(i); } int ans = 0; for (int i = 0; i < n; ++i) { ans = max(ans, (right[i] - left[i] - 1) * heights[i]); } return ans; } };