单调栈大家学过的都能想得到
给的测试用例比较友好五分钟就能通过但是遇到{2,2,4} {4,4,4,4,6} {10,11,11,11,11}这种就完了
我不得不说正常不对数组进行预处理的话,要对两端的数进行特殊的判断计算
我写了快一个小时把自己绕懵了也没写出来{2,2,4}这种数组的正确处理情况
大神的代码一语道破天机 首尾补0!!! 首位补0以后原数组的第一个数就不用单独处理左边界了;尾部补0以后,如果碰上 {1,2,3,4}这种不弹出栈的,也能因为最后一个0逼所有的数弹出去;而0因为乘以别的数都是0所以不影响正常取最大值
太妙了这个预处理!哭了 😭
class Solution {
public int largestRectangleArea(int[] heights) {
int res = 0;
Deque<Integer> stack = new ArrayDeque<>();
//=====================================
//先把原数组前后补0,太特么妙了!!!!!!!
//=====================================
int[] new_heights = new int[heights.length + 2];
for (int i = 1; i < heights.length + 1; i++) {
new_heights[i] = heights[i - 1];
}
for (int i = 0; i < new_heights.length; i++) {
while (!stack.isEmpty() && new_heights[stack.peek()] > new_heights[i]) {
int cur = stack.pop();
int l = stack.peek();
int r = i;
res = Math.max(res, (r - l - 1) * new_heights[cur]);
}
stack.push(i);
}
return res;
}
}
我枯了,你呢
这几天有在做题 懒得写博客了,因为我要不说话装高手