Trapping rain water

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值