求直方图里的最大面积



import java.util.Arrays;
import java.util.Scanner;

/**
 * @Title: Longest_Up.java
 * @Package
 * @Description: TODO
 * @author nutc
 * @date 2013-9-8 下午7:16:34
 * @version V1.0
 */
public class Longest_Up {

	public static void main(String args[]) {

		
		Longest_Up l = new Longest_Up();
		int[] a = {1,1};
		System.out.println(l.largestRectangleArea1(a));
	}
	
	
	public int largestRectangleArea1(int[] height) {
        if(height==null||height.length==0) return 0;
        if(height.length==1) return height[0];
        
        int[] dp = new int[height.length];
        int[] rdp = new int[height.length];
        findDp(height,dp);
        findRdp(height,rdp);
        System.out.println(Arrays.toString(dp));
        System.out.println(Arrays.toString(rdp));
        int max = 0;
        for(int i=0;i<height.length;i++){
        	int area = (rdp[i]-1-(dp[i]+1)+1) * height[i];
        	if(area>max)
        		max = area;
        }
        return max;
    }
	
	public void findDp(int[] a,int[] dp){
		Arrays.fill(dp, -1);
		for(int i=1;i<a.length;i++){
			int j= i-1;
			while(j>=0 && a[j]>=a[i]) //这里有等号!!
				j = dp[j];
			dp[i]=j;
		}
	}
	
	public void findRdp(int[] a,int[] dp){
		Arrays.fill(dp, a.length);
		for(int i=a.length-2;i>=0;i--){
			int j= i+1;
			while(j<a.length && a[j]>=a[i])  //这里有等号!!
				j = dp[j];
			dp[i]=j;
		}
	}
	



}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值