zoukankan      html  css  js  c++  java
  • [leedcode 84] Largest Rectangle in Histogram

    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.

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

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

    For example,
    Given height = [2,1,5,6,2,3],
    return 10.

    public class Solution {
        public int largestRectangleArea(int[] height) {
            //维护一个递增的栈,栈保存的是数组下标
            /*遍历height数组,
            1 如果stack为空或者当前元素的高度大于等于height stack顶元素(前一个元素)的高度 => 把当前高度的index添加到stack顶
            2 如果当前元素的高度小于height stack顶元素的高度 => 持续弹栈直到当前元素的高度大于栈顶元素,并每次都计算面积(height[temp]*(stack           .empty()?i:(i-stack.peek()-1)),保存最大面积。
            3 本题有一个讨巧之处,为了防止最后栈不为空,在height的最后一位补0 ,可以使栈中所有元素的弹出*/
            int res=0;
            if(height==null||height.length<1) return res;
            height=Arrays.copyOf(height,height.length+1);
            height[height.length-1]=0;
            int i=0;
            Stack<Integer> stack=new Stack<Integer>();
            while(i<height.length){
                if(stack.empty()||height[i]>=height[stack.peek()]){
                    stack.push(i++);
                }else{
                    int temp=stack.pop();
                    res=Math.max(res,height[temp]*(stack.empty()?i:(i-stack.peek()-1)));
                }
            }
            return res;
          /*  只要知道第i个条左边连续多少个(a)比他高   右边连续多少个(b)比他高  那么以这个条为最大高度的面积就是hi*(a+b+1);
            可以发现   当第i-1个比第i个高的时候   比第i-1个高的所有也一定比第i个高  
    
            于是可以用到动态规划的思想
    
            令left[i]表示包括i在内比i高的连续序列中最左边一个的编号   right[i]为最右边一个的编号
    
            那么有:当h[left[i]-1]>=h[i]]时   left[i]=left[left[i]-1]  从前往后可以递推出left[i]   
    
            同理:当h[right[i]+1]>=h[i]]时   right[i]=right[right[i]+1]   从后往前可递推出righ[i]
    
            最后答案就等于 max((right[i]-left[i]+1)*h[i])了,但是结果是TLE*/
            /*int res=0;
            if(height==null||height.length<1) return res;
            int h[]=new int[height.length+2];
            for(int i=1;i<h.length-1;i++){
                h[i]=height[i-1];
            }
            h[0]=-1;
            h[h.length-1]=-1;
            int left[]=new int[height.length+1];
            int right[]=new int[height.length+1];
            for(int i=1;i<=height.length;i++){
                left[i]=i;right[i]=i;
            }
            for(int i=1;i<=height.length;i++){
                while(h[left[i]-1]>=h[i]){
                    left[i]=left[left[i]-1];
                }
            }
            for(int i=1;i<=height.length;i++){
                while(h[right[i]+1]>=h[i]){
                    right[i]=right[right[i]+1];
                }
            }
            for(int i=1;i<h.length-1;i++){
                res=Math.max(res,h[i]*(right[i]-left[i]+1));
            }
            return res;*/
        }
    }
  • 相关阅读:
    tp5更改入口文件到根目录的方法分享
    Linux安装JBOSS
    JBOSS和WebLogic区别
    面向对象编程的思维方式
    Struts+Spring+Hibernate整合入门详解
    DB2 UDB V8.1 管理
    oracle与DB2的一些架构
    oracle和DB2的差异
    JDK和JRE的区别
    Linux安装weblogic
  • 原文地址:https://www.cnblogs.com/qiaomu/p/4649358.html
Copyright © 2011-2022 走看看