跟接雨水差不多,但单调栈是从大到小。 而且需要在首尾加入一个最低的0方便出栈计算,否则可能遍历完毕后无法出栈。
class Solution {
public int largestRectangleArea(int[] heights) {
Deque<Integer> stk = new LinkedList<Integer>();
int[] newh = new int[heights.length + 2];
newh[0] = 0;
for(int i=0; i<heights.length; i++) {
newh[i+1] = heights[i];
}
newh[newh.length - 1] = 0;
int res = 0;
stk.push(0);
for(int i=0; i<newh.length; i++) {
if(newh[i] > newh[stk.peek()]) {
stk.push(i);
}
else if (newh[i] == newh[stk.peek()]){
stk.pop();
stk.push(i);
}
else {
while(newh[i] < newh[stk.peek()]) {
int mid = stk.peek();
stk.pop();
int left = stk.peek();
int right = i;
int h = newh[mid];
int w = right - left - 1;
res = Math.max(res, h * w);
}
stk.push(i);
}
}
return res;
}
}
完结总结: 按类型刷题确实比盲目刷要好, 对贪心和动规的理解比以前更好了一些。 还是需要复习和二刷。 第一次用java刷题,也算练练手,以前都是用c++