诱捕雨水:蛮力逼近的虫子

时间:2018-06-11 22:28:47

标签: python c++ arrays algorithm

我一直在研究以problem开头的Leetcode approach 1的不同算法。如果阵列值是墙的高度,则问题需要计算总水面积(柱宽= 1)。

第一种方法是找到每列左侧和右侧最大墙高的最小高度,如果柱高小于最小值,则将水添加到给定柱的顶部。取最小值,因为这是收集的水可以达到的最高值。要计算每一方的最大值,需要对左侧和右侧进行n-1遍历。

我在Python中编码,但这里是C ++中的代码,根据Leetcode给出的解决方案。

int trap(vector<int>& height)
{
    int ans = 0;
    int size = height.size();
    for (int i = 1; i < size - 1; i++) {
        int max_left = 0, max_right = 0;
        for (int j = i; j >= 0; j--) { //Search the left part for max bar size
            max_left = max(max_left, height[j]);
        }
        for (int j = i; j < size; j++) { //Search the right part for max bar size
            max_right = max(max_right, height[j]);
        }
        ans += min(max_left, max_right) - height[i];
    }
    return ans;
}

我注意到左侧和右侧列的最大值包括外部循环迭代中的当前列。这样,您可以获得的最低值为0.请确认这是正确的。我在min()0之间使用了potentialWater来收集我的代码。

我查看了代码,并以自己的方式重新编写了代码,但我收到了0,因为我的总雨水已经收集到6。我的代码中的错误在哪里?

class Solution:
  def trap(self, height):
    """
    :type height: List[int]
    :rtype: int
    """

    if len(height) <= 2:
      return 0

    water = 0
    for col in range(1, len(height)-1):
      maxLeft = 0
      maxRight = 0

      for index in range(col):
        maxLeft = max(maxLeft, height[index])
      for index in range(col+1,len(height)):
        maxRight = max(maxRight, height[index])

      minHeight = min(maxLeft, maxRight)
      # print(col, minHeight)
      # minHeight = min(max(height[:col]), max(height[col+1:]))
      potentialWater = minHeight - col
      # print(potentialWater)
      # water += potentialWater
      water += max(0, potentialWater) # in case this is the highest column

    return water

solution = Solution()
height = [0,1,0,2,1,0,1,3,2,1,2,1]
print(solution.trap(height))

1 个答案:

答案 0 :(得分:1)

简单的调试策略很快将问题缩小到这一行:

  potentialWater = minHeight - col

为什么从最小高度中减去列数字?这些都不是同一类的数量。相反,您想要减去当前列的高度

  potentialWater = minHeight - height[col]

通过这种改变,我们得到了所需的输出:

$ python3 trap.py
6

正如已经注意到的评论,你应该使用Pythonic编程习语,例如替换

for index in range(col):
  maxLeft = max(maxLeft, height[index])
for index in range(col+1,len(height)):
  maxRight = max(maxRight, height[index])

maxLeft = max(height[:col])
  maxRight = max(height[col+1:])