LeetCode.H84.柱状图中最大的矩形
题目:
题目大意:
如图所示。
数据范围:
1 <= heights.length <=1e5
0 <= heights[i] <= 1e4
思路:
单调栈:分析问题,对于每个柱子,分别寻找其左边比它低的且距离最近的柱子(下标为l,如果没有则为-1),和右边比它低的且距离最近的柱子(下标为r,如果没有则为n)。那么这个高度等于这个柱子的矩形的面积为 (r - l) * height[i]。
那么问题就变成了如何找到两边比它低的且距离最近的柱子
对于左边:问题相当于找到每个数左边第一个比它小的数的下标,如果没有则为 -1,即【单调栈】。
对于左边:问题相当于找到每个数右边第一个比它小的数的下标,如果没有则为 n,即使用单调栈,从后向前遍历。
计算每个柱子所能构成最大的面积即可。
代码:
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
class Solution {
public int largestRectangleArea(int[] heights) {
Deque<Integer> stk = new ArrayDeque<>();
int[] lrange = new int[heights.length];
for (int i = 0; i < heights.length; i ++ ){
while (!stk.isEmpty() && heights[stk.peek()] >= heights[i]){
stk.pop();
}
lrange[i] = stk.isEmpty() ? -1 : stk.peek();
stk.push(i);
}
stk.clear();
int[] rrange = new int[heights.length];
for (int i = heights.length - 1; i >= 0; i -- ){
while (!stk.isEmpty() && heights[stk.peek()] >= heights[i]){
stk.pop();
}
rrange[i] = stk.isEmpty() ? heights.length : stk.peek();
stk.push(i);
}
int ans = -1;
for (int i = 0; i < heights.length; i ++ ){
ans = Math.max(ans, (rrange[i] - lrange[i] - 1) * heights[i]);
}
return ans;
}
}
public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
int[] heights = new int[]{3,2,6,5,1,2};
System.out.println(solution.largestRectangleArea(heights));
}
}
时空复杂度分析等:
-
时间复杂度 : O(n)
-
空间复杂度 : O(n)