题意:找出能够容纳的最大容积是多少
思路一:首先,定义两个数组left[]和right[],分别记录当前位置的左边和右边的最大高度;先从左至右遍历数组,找出当前位置的左边的最大高度,再从右至左遍历,找出当前位置右边的最大高度;最后遍历数组,能容纳的大小就是min(max_left[i],max_right[i])-height之和。
代码:package TrappingWater;
public class TrappingWater {
public int Trap(int []arr){
int []left = new int [arr.length];
int []right = new int[arr.length];
left[0] = arr[0];
int max = arr[0];
for(int i = 1 ; i <arr.length ; i++){
left[i] = Math.max(max,arr[i]);
max = Math.max(max, arr[i]);
}
right[arr.length - 1] = arr[arr.length - 1];
max = arr[arr.length - 1];
for(int j = arr.length - 2 ; j >= 0 ; j--){
right[j] = Math.max(max,arr[j]);
max = Math.max(max, arr[j]);
}
int total = 0;
for (int k = 1 ; k < arr.length-1 ; k ++){
int sum = Math.min(left[k], right[k]) - arr[k];
total+=sum;
}
return total;
}
public static void main(String[] args) {
TrappingWater tw = new TrappingWater();
long start = System.nanoTime();
int []array = {0,1,0,2,1,0,1,3,2,1,2,1};
int num = tw.Trap(array);
long end = System.nanoTime();
System.out.println(num);
System.err.println((end-start)/1000000);
}
}
思路二:先找出序列中最大的数值,在分别从前往后遍历到这个最大的数值,从后往前遍历到最大的数值即可,但这个方法有一个bug,如果最大的数值不是唯一的话,得到的结果就不正确。
代码:package TrappingWater2;
import javax.rmi.CORBA.Tie;
import javax.swing.plaf.synth.SynthStyle;
public class TrappingWater2 {
public int Trap(int []arr){
int max = arr[0];
int total = 0;
for(int i = 1 ; i < arr.length ; i++){
if(arr[i] > max) max = i;
}
int peak = arr[0];
for(int i = 1 ; i < max ;i++){
if(arr[i] > peak) peak = arr[i];
else total +=peak - arr[i];
}
int top = arr[arr.length-1];
for(int j = arr.length -2 ; j > max ; j--){
if(arr[j] > top) top = arr[j];
else total += top-arr[j];
}
return total;
}
public static void main(String[] args) {
int []arrar = {2,1,0,5,1,2};
TrappingWater2 tw2 = new TrappingWater2();
int temp = tw2.Trap(arrar);
System.out.println(temp);
}
}