美文网首页@IT·互联网
LeetCode每日一题:largest rectangle i

LeetCode每日一题:largest rectangle i

作者: yoshino | 来源:发表于2017-05-17 17:22 被阅读49次

问题描述

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.


1

Above is a histogram where width of each bar is 1, given height =[2,1,5,6,2,3].


2
The largest rectangle is shown in the shaded area, which has area =10 unit.
For example,

Given height =[2,1,5,6,2,3],
return10.

问题分析

这一题也是LeetCode上十分经典的一题了,求相邻直方图的最大面积,这题的第一想法是用dp来做,但是想了很久,都没有想到怎么做,只能看网上用栈实现的方式了,这题采用的想法很巧妙,采用栈来构造升序序列实现:
下面用栈实现一下题目中的样例[2,1,5,6,2,3]:

  1. 2进栈,s={2},result=0;
  2. 1比栈顶元素2小,无法进栈,弹出2,记录当前result=2*1=2,其中1表示2是弹出的第一个元素,1进栈,2用1替换也进栈,s={1,1}
  3. 5比栈顶元素1大,进栈,s={1,1,5},result不变
  4. 6比栈顶元素5大,进栈,s={1,1,5,6},result不变
  5. 2比栈顶元素6小,弹出6,result=6*1=6(6是弹出的第一个元素),继续尝试进栈,此时s={1,1,5}
  6. 2还是比栈顶元素5小,弹出5,result=5*2=10(5是弹出的第二个元素了),再次尝试进栈,此时s={1,1}
  7. 2比栈顶元素1小,可以进栈,把5和6变成2,重新进栈,result不变,s={1,1,2,2,2}
  8. 3比栈顶元素2小,进栈,s={1,1,2,2,2,3},result不变
  9. 至此,所有元素进栈完成,并且有序,result=10
  10. 计算栈内大小,result=max(result,栈元素*所在位置深度)=(result,3*1,2*2,2*3,2*4,1*5,1*6)=10
  11. 所求的result大小就为10

代码实现

public int largestRectangleArea(int[] height) {
        if (height.length == 0) return 0;
        Stack<Integer> stack = new Stack<>();
        int result = 0;
        for (int i = 0; i < height.length; i++) {
            if (stack.isEmpty() || stack.peek() <= height[i]) stack.push(height[i]);
            else {
                int count = 0;
                while (!stack.isEmpty() && stack.peek() > height[i]) {
                    count++;
                    result = Math.max(result, stack.peek() * count);
                    stack.pop();
                }
                while (count > 0) {
                    count--;
                    stack.push(height[i]);
                }
                stack.push(height[i]);
            }
        }
        int depth = 1;
        while (!stack.isEmpty()) {
            result = Math.max(result, stack.peek() * depth);
            stack.pop();
            depth++;
        }
        return result;
    }

相关文章

网友评论

    本文标题:LeetCode每日一题:largest rectangle i

    本文链接:https://www.haomeiwen.com/subject/wjndxxtx.html