我们需要维护一个递增的stack。
举例现在在stack里是1,3,5,7。现在来了4,说明以7为高度生成矩阵已经不可能在增长了。把7pop出来,算出以7为高的矩阵和全局比较。在继续这么比较。在数组最后push -1进去,使stack里剩余的高度都能被计算。实际在stack里是高度对应的Index,不是高度本身。宽度:当stack已经为空了则为当前要push的i,否则为i - stack.peek() - 1。
public class Solution {
//Time: O(n) Space: O(n)
public int largestRectangleArea(int[] height) {
if (height == null || height.length == 0) {
return 0;
}
int max = 0;
Stack<Integer> stack = new Stack<Integer>();
for (int i = 0; i <= height.length; i++) {
int h = i != height.length ? height[i] : -1;
while (!stack.isEmpty() && height[stack.peek()] > h) {
int index = stack.pop();
int w = stack.isEmpty() ? i : (i - stack.peek() - 1);
max = Math.max(max, height[index] * w);
}
stack.push(i);
}
return max;
}
}
No comments:
Post a Comment