一个数组代表一个墙的高度,问说最终可以盛放多少水。
public class Main2 {
public static void main(String args[]){
// System.out.println(TimeUnit.MILLISECONDS.toHours(System.currentTimeMillis()));
int arrays1[]={2,5,1,2,3,4,7,7,6};
int arrays2[]={2,5,1,3,1,2,1,7,7,6};
int arrays3[]={6,5,4,3,2,1};
System.out.println(volunm(arrays1));
System.out.println(volunm(arrays2));
System.out.println(volunm(arrays3));
}
public static int volunm(int[] array){
int r = 0;
int max_index = 0;
int max = 0;
for (int i = 0; i < array.length; i++){
if (array[i] > max) {
max = array[i];
max_index = i;
}
}
max = array[0];
for (int i = 1 ; i < max_index; i++){
if (array[i] < max){
r += (max - array[i]);
} else {
max = array[i];
}
}
max = array[array.length - 1];
for(int i = array.length - 1; i > max_index; i--){
if (array[i] < max) {
r += (max - array[i]);
} else {
max = array[i];
}
}
return r;
}
两趟遍历的方法比较直观。
第一趟找到最高点。目的是只要知道有一个最高点,那么可以采用夹逼法从两侧逼近最高点。
第二趟遍历,从两侧夹逼。维护一个当前最高,只要比这个值小,就可以积水,否则就重新设置当前最高值。