最大的连续矩形面积

/**
 * 一段最大的连续矩形面积
 * 一排高低各不相同的单位长度的矩形,然后让你在这个多边形中求一个面积最大的矩形
 * 
 * 原始方法,枚举每一个矩形,向左或者向右伸展。复杂度O(n*n)
 * 
 * 改进:
 * 空间换时间。一次一步的伸展,改进为一次多步。
 * 
 * 思路类似SpecialElements
 * 
 *
 */

public class MaxRetangle {

	public int maxArea(int[] a, int n){
		assert(true);
		int[] left = createLeft(a, n);
		int[] right = createRight(a, n);
		int max = 0;
		for(int i = 0; i<n; i++){
			int area = (right[i] - left[i] + 1) * a[i];
			if(area > max){
				max = area;
			}
		}
		return max;
	}
	
	private int[] createLeft(int[] a, int n){
		int[] left = new int[n];
		for(int i=1; i<n; i++){
			int p = i;
			while(true){
				if(a[i] > a[p-1]){
					left[i] = p;
					break;
				}else{
					left[i] = left[p-1];
					if(left[i] > 0){
						p = left[i];
					}else{
						break;
					}
				}
				
			}
		}
		return left;
	}
	
	private int[] createRight(int[] a, int n){
		int[] right = new int[n];
		right[n-1] = n-1;
		for(int j=n-2; j>=0; j--){
			int p = j;
			while(true){
				if(a[j] > a[p+1]){
					right[j] = p;
					break;
				}else{
					right[j] = right[p+1];
					if(right[j] < n-1){
						p = right[j];
					}else{
						break;
					}
				}
			}
		}
		return right;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] a = {6,7,1,2,3,9,4,5, 8};
		MaxRetangle mr = new MaxRetangle();
		int max = mr.maxArea(a, a.length);
		System.out.println(max);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值