【问题标题】:Why is the DP solution not working, Trapping Rain Water?为什么 DP 解决方案不起作用,捕获雨水?
【发布时间】:2021-04-01 20:27:39
【问题描述】:

给定 n 个非负整数表示海拔图,其中每个条的宽度为 1,计算下雨后它可以捕获多少水。

示例: 输入:高度 = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 说明:上面的高程图(黑色部分)用数组[0,1,0,2,1,0,1,3,2,1,2,1]表示。在这种情况下,有 6 个单位的雨水(蓝色部分)被截留。

**Constraints**:

n == height.length
0 <= n <= 3 * 104
0 <= height[i] <= 105

问题在于,当输入为 [2,0,2] 时输出 0,但代码应将索引 1 设置为 leftMax 为 2,rightMax 为 2,因此 2-0=2应该是输出

class Solution {
    public int trap(int[] height) {
        
        if(height == null || height.length == 0){
            return 0;
        }
        
        int ans = 0;
        int size = height.length;
        
        int[] leftMax = new int[size];
        int[] rightMax = new int[size];
        
        leftMax[0] = height[0];
        for(int i = 1; i < size; i++){
            leftMax[i] = Math.max(leftMax[i-1],height[i]);
        }
        
        rightMax[0] = height[size-1];
        for(int i = size-2; i >= 0; i--){
            rightMax[i] = Math.max(rightMax[i+1],height[i]);
        }
        
        for(int i = 1; i < size-1; i++){
            ans+= Math.min(leftMax[i],rightMax[i])-height[i];
        }
        return ans;
    }
}

【问题讨论】:

  • 它是否适用于其他更复杂的示例?
  • @luk2302 是的,它似乎确实可以处理复杂的示例
  • 我认为您的 rightMax[0] 初始化应该是 rightMax[size-1] 一个。
  • @luk2302 我试试看,谢谢

标签: java algorithm


【解决方案1】:

问题是您的rightMax 初始化错误,它“在错误的一侧”初始化。它初始化 [0] 可能是从 leftMax 部分复制的。但是leftMax从左边迭代,rightMax从右边迭代,因此最右边的索引应该被初始化。请注意,您已经使用正确的 height 索引进行了初始化,但使用了错误的 rightMax - 它应该如下所示:

rightMax[size-1] = height[size-1]

这以前有效,因为最右边的(可能)不是集水器的一部分,因此它的错误值没有任何影响。但在非常简单的 2,0,2 的情况下,它是陷阱的一部分,并弄乱了结果。

现在代码正确地计算了两个给定的样本:

System.out.println(trap(new int[] {0,1,0,2,1,0,1,3,2,1,2,1})); // 6
System.out.println(trap(new int[] {2,0,2})); // 2

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多