LeetCode刷题记142
84. 柱状图中最大的矩形
class Solution {
public int largestRectangleArea(int[] heights) {
int[][] ind = new int[heights.length][2];
Stack<Integer> sta = new Stack<Integer>();
for (int i = 0; i < heights.length; i ++) {
ind[i][1] = heights.length;
while (sta.isEmpty() == false) {
if (heights[sta.peek()] >= heights[i]) {
ind[sta.peek()][1] = i;
sta.pop();
} else break;
}
if (sta.isEmpty() == false) ind[i][0] = sta.peek();
else ind[i][0] = -1;
sta.push(i);
}
int ans = 0;
for (int i = 0; i < heights.length; i ++) {
ans = Math.max(ans, heights[i] * (ind[i][1] - ind[i][0] - 1));
}
return ans;
}
}
2/3
142/150
————————————再做一次的分割线————————————————
class Solution {
public int largestRectangleArea(int[] heights) {
if (heights.length == 0) return 0;
int[] sta = new int[heights.length]; //模拟栈,记录下标,这里存的高度是严格递增的
int top = -1;
int ans = 0;
for (int i = 0; i < heights.length; i ++) {
while (top > -1 && heights[sta[top]] >= heights[i]) {
top --;
}
sta[++ top] = i;
ans = Math.max(ans, heights[sta[0]] * (i + 1));
for (int j = 1; j <= top; j ++) {
ans = Math.max(ans, heights[sta[j]] * (i - sta[j - 1]));
}
}
return ans;
}
}
能过但是太暴力了,比较慢。下面是改进的。
class Solution {
public int largestRectangleArea(int[] heights) {
int[][] lr = new int[heights.length][2];
int[] sta = new int[heights.length]; //模拟栈,记录下标,这里存的高度是严格递增的
int top = -1;
int ans = 0;
for (int i = 0; i < heights.length; i ++) {
while (top > -1 && heights[sta[top]] >= heights[i]) {
lr[sta[top]][1] = i; //右下标是最近的一个高度小于等于自己的柱子
top --;
}
lr[i][0] = top > -1 ? sta[top] + 1 : 0; //左下标是最近的一个高度大于等于当前柱子的
sta[++ top] = i;
lr[i][1] = heights.length; //暂定最右边是最后一个
}
for (int i = 0; i < heights.length; i ++) {
//System.out.println(lr[i][0] + " " + lr[i][1]);
ans = Math.max(ans, (lr[i][1] - lr[i][0]) * heights[i]);
}
return ans;
}
}