二刷

import java.util.*;


public class Solution {
    /**
     * max water
     * @param arr int整型一维数组 the array
     * @return long长整型
     */
    public long maxWater (int[] arr) {
        int[] left = new int[arr.length];
        int[] right = new int[arr.length];

        long res = 0;

        for(int i=1;i<arr.length;i++){
            left[i] = Math.max(left[i-1],arr[i-1]);
        }
        for(int i=arr.length-2;i>=0;i--){
            right[i] = Math.max(right[i+1],arr[i+1]);
        }
        for(int i=0;i<arr.length;i++){
            int num = Math.min(left[i],right[i]);
            if(num>arr[i]){
                res = res + num - arr[i];
            }
        }
        return res;
    }
}

最开始 一行一行扫描,结果显示超时了
还有这个 long sum真的很坑。 之前是int 一直无法通过。
双层循环。O(N*2)。

import java.util.*;


public class Solution {
    /**
     * max water
     * @param arr int整型一维数组 the array
     * @return long长整型
     */
    private int getMax(int[] height) {
        int max = 0;
        for (int i = 0; i < height.length; i++) {
            if (height[i] > max) {
                max = height[i];
            }
        }
        return max;
    }


    public long maxWater (int[] arr) {
        int arr_max = getMax(arr);
        long sum = 0;
        for(int i = 1; i<= arr_max; i++){
            int temp = 0;
            int flag = 0; //判断是否开始计算
            for(int j=0; j<arr.length;j++){
                if(arr[j]>=i && flag == 0){
                    flag++;
                }
                if(arr[j]>=i && flag == 1){ //遇到一个比当前高的就把temp加到sum中
                    sum = sum + temp;
                    temp = 0;
                }
                if(arr[j]<i && flag == 1){
                    temp++;
                }
            }
        }
        return sum;

    }
}

2.动态规划真的很好用
动态规划代码可太简洁了, 只需要三个循环,分别算出这列 左右最高的值,然后根据木桶原理比较。

import java.util.*;


public class Solution {
    /**
     * max water
     * @param arr int整型一维数组 the array
     * @return long长整型
     */

    public long maxWater (int[] arr) {
        long sum=0;
        int len = arr.length;
        int[] leftmax = new int[len];
        int[] rightmax = new int[len];

        leftmax[0] = arr[0];
        for(int i=1;i<len-1;i++){
            leftmax[i] = Math.max(leftmax[i-1],arr[i-1]);
        }

        rightmax[len-1] = arr[len-1];
        for(int i=len-2; i>0;i--){
            rightmax[i] = Math.max(rightmax[i+1],arr[i+1]);
        }

        for(int i=1;i<len-1;i++){
            int min = Math.min(rightmax[i],leftmax[i]);
            if(min>arr[i]){
                sum = sum + min - arr[i];
            }
        }

        return sum;
    }
}

3.双指针还没有看