Trapping rain water

来源:互联网 发布:linux piwik 安装 编辑:程序博客网 时间:2024/05/18 14:42

题意:找出能够容纳的最大容积是多少
思路一:首先,定义两个数组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);}

}

0 0