go + 动态规划

/**
 * max water
 * @param arr int整型一维数组 the array
 * @return long长整型
*/
func maxWater( arr []int ) int64 {
    n:= len(arr)
    if n == 0 {
        return 0
    }

//     1.记录height中的每个元素,从左向右扫描并记录右边的最大高度
//     2.记录height中的每个元素,从右向左扫描并记录右边的最大高度
//     3.将左右位置元素对比取最小的元素,减去数组当前元素的高度

    //记录左边每个元素最大高度
    leftMax := make([]int, n)
    leftMax[0] = arr[0]
    for i:=1; i< n; i++{
        leftMax[i] = max(leftMax[i-1], arr[i])
    }

    //记录右边每个元素最大高度
    rightMax := make([]int, n)
    rightMax[n-1] = arr[n-1]
    for i:=n-2; i>=0; i--{
        rightMax[i] = max(rightMax[i+1], arr[i])
    }

    sum := 0
    for i:=1; i<n-1; i++{
        height := min(leftMax[i], rightMax[i])
        sum += max(0, height-arr[i])
    }

    return int64(sum)
}


func max(a, b int) int {
    if a>b{return a}
    return b
}
func min(a, b int) int {
    if a>b{return b}
    return a
}