您的位置:首页 > 编程语言 > Java开发

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

2017-07-07 21:29 183 查看
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
;
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: