Maximize the rectangular area under Histogram

前端 未结 11 872
天涯浪人
天涯浪人 2020-11-28 17:26

I have a histogram with integer heights and constant width 1. I want to maximize the rectangular area under a histogram. e.g.:

 _
| |
| |_ 
|   |
|   |_
|           


        
11条回答
  •  南笙
    南笙 (楼主)
    2020-11-28 18:07

    I coded this one and felt little better in the sense:

    import java.util.Stack;
    
         class StackItem{
           public int sup;
           public int height;
           public int sub;
    
           public StackItem(int a, int b, int c){
               sup = a;
               height = b;
               sub =c;
           }
           public int getArea(){
               return (sup - sub)* height;
           }
    
    
           @Override
           public String toString(){
           return "     from:"+sup+
                  "     to:"+sub+
                  "     height:"+height+              
                  "     Area ="+getArea();
           }
        }   
    
    
    public class MaxRectangleInHistogram {    
        Stack S;
        StackItem curr;
        StackItem maxRectangle;
    
        public StackItem getMaxRectangleInHistogram(int A[], int n){
            int i = 0;
            S = new Stack();        
            S.push(new StackItem(0,0,-1));
            maxRectangle = new StackItem(0,0,-1);
    
            while(i S.peek().height){
                                S.push(curr); 
                        }else if(curr.height == S.peek().height){                            
                                S.peek().sup = i+1;                         
                        }else if(curr.height < S.peek().height){                            
    
                                while((S.size()>1) && (curr.height<=S.peek().height)){
                                    curr.sub = S.peek().sub;
                                    S.peek().sup = i;
                                    decideMaxRectangle(S.peek());
                                    S.pop(); 
                                }                               
                            S.push(curr);                    
                        }
                i++;
            }
    
            while(S.size()>1){ 
                S.peek().sup = i;
                decideMaxRectangle(S.peek());
                S.pop();            
            }  
    
            return maxRectangle;
        }
    
        private void decideMaxRectangle(StackItem s){ 
    
            if(s.getArea() > maxRectangle.getArea() )
                maxRectangle = s;      
        }
    
    }
    

    Just Note:

    Time Complexity: T(n) < O(2n) ~ O(n)
    Space Complexity S(n) < O(n)
    

提交回复
热议问题