美团-直方图内最大矩形-Java

直方图最大矩形面积
import org.junit.Test;

/**
 * 题目描述
 * 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。
 * 比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。
 * 给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。 
 * 测试样例: [2,7,9,4,1],5
 * 返回:14
 * 
 * @author 崔洪振367
 * @version 创建时间:2017年7月7日 下午5:20:27
 * 解题思路:遍历数组,对应元素i,然后从将i为界,分成前后两部分,分别遍历与i相邻的直方图的值大于等于i,则计数器count++。
 * 然后求出以i为中心的最大的面积,保存。最后遍历所有面积,找出最大值。
 */
public class 直方图内最大矩形 {
	@Test
	public void test() {
//		int[] A = {2,7,9,4,1};
//		int n = 5;
		int[] A = {123,91,771,113,333,215,438,667,460,510,220,532,536,55,162,158,692,435,586,96,11,815,603,695,431,221,835,125,32,38,415,440,1,177,364,132,587,414,576,133,837,514,663,134,428,706,158,581,239,650,814,140,16,93,160,210,202,767,21,782,812,96,220,10,164,793,536,391,84,103,730,526,197,653,642,300,513,510,527,481,627,387,160,225,314,751,161,385,657,847,199,276,124,290,677,350,785,302,814,252,346,295,138,719,262,604,781,355,729,715,402,748,730,503,508,373,144,791,480,205,588,103,471,699,640,755,139,647,357,331,754,563,8,308,548,586,589,272,192,60,703,846,601,170,695,201,400,765,230,516,148,153,267,127,21,703,755,248,535,68,56,728,712,826,70,169,551,619,446,824,678,595,79,61,496,109,579,813,528,277,298,31,600,266,814,246,47,501,295,683,612,186,701,483,220,614,345,278,161,113,256,76,57,387,600,549,698,336,669,689,793,125,203,378,404,307,570,747,89,715,404,125,16,536,627,261,572,218,280,714,410,572,282,812,11,464};
		int n = 236;
		System.out.println(countArea(A, n));
	}
	
    public int countArea(int[] A, int n) {
        if(A == null || n == 0){
        	return 0;
        }
        
        int[] area = new int[n];
        for(int i=0; i<n; i++){
        	int h = A[i];
        	int count = 1;
        	for(int j=i-1; j>=0; j--){
        		if(A[j] >= h){
        			count++;
        		}else{
        			break;
        		}
        	}
        	
        	for(int j=i+1; j<n; j++){
        		if(A[j] >= h){
        			count++;
        		}else{
        			break;
        		}
        	}
        	area[i] = count*h;
        	
        }
        
        int maxArea = 0;
        for(int i=0; i<n; i++){
        	if(maxArea < area[i]){
        		maxArea = area[i];
        	}
        }
    	
    	return maxArea;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值