“看下面这个图片”
“在这个图片里我们有不同高度的墙。这个图片由一个整数数组所代表,数组中每个数是墙的高度。上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]”
“假如开始下雨了,那么墙之间的水坑能够装多少水呢?”
“以1×1的方块为单位计算容积。所以,在上边的图中下标为1以左的都会漏掉。下标7以右的也会漏掉。
package cn.baokx;
public class Test0 {
public static void main(String[] args) {
int [] a1 = {2,5,1,2,3,4,7,7,6};
int [] a2 = {2,5,1,3,1,2,1,7,7,6};
int [] a3 = {6,1,4,6,7,5,1,6,4};
System.out.println(getResult(a1));
System.out.println(getResult(a2));
System.out.println(getResult(a3));
}
public static int getResult(int [] a){
if(a==null||a.length<3){
return 0 ;
}
int result = 0 ;
int array_max = getRightMax(a,0);
int left_max = a[0] ;
int right_max = getRightMax(a,2);
//遍历下标为1至a.length-2的数组元素
for(int i = 1 ; i < a.length - 1 ; i++){
right_max = getRightMax(a,i+1);
// 只有当前元素高度和左边最大值和右边最大值相比均小于的时候才可以装水
if(a[i] < left_max && a[i] < right_max){
result += array_max-Math.abs(left_max - right_max)-a[i];
}
left_max = a[i]>left_max?a[i]:left_max;
}
return result;
}
public static int getRightMax(int [] array,int index){
int max = array[index];
for(int i = index ; i < array.length ; i++){
max = array[i]>max?array[i]:max;
}
return max;
}
}
另外一种方式,时间复杂度更小(---by
tianshen0128)
package cn.baokx;
public class Test11 {
public static void main(String[] args) {
int [] a1 = {2,5,1,2,3,4,7,7,6};
int [] a2 = {2,5,1,3,1,2,1,7,7,6};
int [] a3 = {6,1,4,6,7,5,1,6,4};
System.out.println(getResult(a1));
System.out.println(getResult(a2));
System.out.println(getResult(a3));
}
public static int getResult(int [] array){
int sum = getIntArraySum(array);
//获得最大值,及坐标
int max = 0;
int max_index = 0;
for (int i = 0; i < array.length; i++) {
if(array[i]>max){
max = array[i];
max_index = i;
}
}
int left_max = 0;
for (int i = 0; i <= max_index; i++) {
if( array[i]<left_max){
array[i]=left_max;
}else{
left_max=array[i];
}
}
int right_max = 0;
for (int i = array.length-1; i > max_index; i--) {
if( array[i]<right_max){
array[i]=right_max;
}else{
right_max=array[i];
}
}
return getIntArraySum(array)-sum;
}
public static int getIntArraySum(int[] array){
int result = 0;
for (int i = 0; i < array.length; i++) {
result+=array[i];
}
return result;
}
}