leetCode 84. Largest Rectangle in Histogram

来源:互联网 发布:vb控件加到窗体上 编辑:程序博客网 时间:2024/05/21 22:36

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 heights = [2,1,5,6,2,3],
return 10.

返回直方图最大矩形

本来用动态规划做,但是超时了

public static int largestRectangleArea(int[] heights) {         if(heights==null||heights.length<1)return 0;         int n=heights.length;         int dp[][]=new int [n+1][n+1];         int min[][]=new int [n+1][n+1];         int max=0;         for(int i=1;i<=n;i++){            min[i][i]=heights[i-1];            dp[i][i]=heights[i-1];            if(heights[i-1]>max)                max=heights[i-1];         }         for(int i=1;i<=n;i++){             for(int j=i+1;j<=n;j++){                min[i][j]=heights[j-1]<min[i][j-1]?heights[j-1]:min[i][j-1];             }         }         for(int i=1;i<=n;i++){             for(int j=i+1;j<=n;j++){                if(dp[i][j-1]>max){                    max=dp[i][j-1];                }                if(min[i][j-1]>=heights[j-1]){                    int temp=heights[j-1]*(j-i+1);                    dp[i][j]=temp;                    if(temp>max){                        max=heights[j-1]*(j-i+1);                    }                }                else{                    int temp=min[i][j-1]*(j-i+1);                    if(temp>dp[i][j]){                        dp[i][j]=temp;                        if(temp>max)                        max=temp;                    }                }             }         }        return max;        }

能通过的是参考网上的用栈的方法解决的,思路看这里

 public static int largestRectangleArea(int[] heights) {         if(heights==null||heights.length<1)return 0;         int n=heights.length;         if(n==1)return heights[0];         int max=0;         Stack<Integer> st = new Stack<Integer>();         st.push(heights[0]);         int i=1;         while(i<n){             if(heights[i]>=st.peek()){                 st.push(heights[i]);             }             else{                 int count1=1;                 while(!st.isEmpty()&&st.peek()>heights[i]){                     int temp=st.pop();                     if(count1*temp>max){                         max=count1*temp;                     }                     count1++;                 }                 while(count1-->0){                     st.push(heights[i]);                 }             }             i++;         }         int count1=1;         while(!st.isEmpty()){             int temp=st.pop();             if(count1*temp>max){                 max=count1*temp;             }             count1++;         }         return max;        }
阅读全文
0 0
原创粉丝点击