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;
}