/**
* 一段最大的连续矩形面积
* 一排高低各不相同的单位长度的矩形,然后让你在这个多边形中求一个面积最大的矩形
*
* 原始方法,枚举每一个矩形,向左或者向右伸展。复杂度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);
}
}
最大的连续矩形面积
最新推荐文章于 2021-07-21 21:34:25 发布