本题我觉得在Hard也许算简单的,但是我依然没有解出,不过没关系,本来也需要适应和学习。
    本题需要比较好的抽象能力:
    所有valid的面积都是:
    84. Largest Rectangle in Histogram - 图1
    当这个同时出现的时候,很容易就能得出84. Largest Rectangle in Histogram - 图2的解法。但是本题是要求84. Largest Rectangle in Histogram - 图3的解法

    思路:

    • 设定一个Stack<Integer>,永远保持递增
    • 当遇到比peek()更小的元素的时候,需要不断的pop(),直到找到更小的元素,并顺便计算面积
    • 本题需要画图才能更好理解
      • 最难的地方是理解对于高度heights[i]的左右边界分别是哪两个index,理解了这个后,本题就非常简单了
    • 时间复杂度:84. Largest Rectangle in Histogram - 图4
    • 空间复杂度: 84. Largest Rectangle in Histogram - 图5

      1. class Solution {
      2. public int largestRectangleArea(int[] heights) {
      3. Stack<Integer> stack = new Stack<>();
      4. int maxSize = 0;
      5. for (int i = 0; i < heights.length; ++i) {
      6. while (!stack.isEmpty() && heights[i] < heights[stack.peek()]) {
      7. int height = heights[stack.pop()];
      8. // left bondry: heights[stack.peek()]; right boundry: i
      9. int sz = height * (i - (stack.isEmpty() ? 0 : stack.peek() + 1));
      10. maxSize = Math.max(maxSize, sz);
      11. }
      12. stack.push(i);
      13. }
      14. while (!stack.isEmpty()) {
      15. int height = heights[stack.pop()];
      16. int sz = height * (heights.length - (stack.isEmpty() ? 0 : stack.peek() + 1));
      17. maxSize = Math.max(maxSize, sz);
      18. }
      19. return maxSize;
      20. }
      21. }