# 0084. Largest Rectangle in Histogram ###### tags: `Leetcode` `Hard` `Stack` Link: https://leetcode.com/problems/largest-rectangle-in-histogram/ ## 思路 参考[这里](https://abhinandandubey.github.io/posts/2019/12/15/Largest-Rectangle-In-Histogram.html) **遇到算rectangle的问题就想怎么才能在一个数pop的时候把以它为高的rectangle全算出来** 每次如果一个新的bar来了,并且比现在 栈顶元素对应的heights(h)小,就说明之后产生的rectangle高度不可能再到达h了,此时说明h应该被pop掉,并且记录一下这个bar带来的rectangle area,也就是用它的```height*(i-stack.isEmpty()?0:(stack.peek()+1))``` 要注意的是这里是找```stack.peek()+1```而不是用刚才pop出来的idx 因为从现在的peek到刚pop出来的index中间可能有比pop的高度更高的 但之前被pop出去了 最后返回最大的area ## Code ```java= class Solution { public int largestRectangleArea(int[] heights) { int maxArea = 0; Stack<Integer> stack = new Stack<>(); for(int i = 0;i < heights.length;i++){ while(!stack.isEmpty() && heights[stack.peek()] > heights[i]){ int h = heights[stack.pop()]; int w = i-(stack.isEmpty()?0:(stack.peek()+1)); maxArea = Math.max(maxArea, h*w); } stack.push(i); } // finally pop out any bar left in the stack and calculate the area based on it while (!stack.isEmpty()) { maxArea = Math.max(maxArea, heights[stack.pop()] * (heights.length - (stack.isEmpty() ? 0 : stack.peek() + 1))); } return maxArea; } } ```