当前位置: 首页 > 知识库问答 >
问题:

捕获雨水:蛮力方法中的错误

穆鸿飞
2023-03-14

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

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

我用Python编码,但根据Leetcode上给出的解决方案,这里是C语言代码。

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。请确认这是正确的。我在0potentialWater之间使用了min()在我的代码中收集。

我查看了代码并以自己的方式重写了它,但我得到了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个答案

高宇定
2023-03-14

简单的调试策略可以迅速将问题缩小到这一行:

  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:])
 类似资料:
  • 我是Python新手,刚刚开始尝试使用LeetCode来构建我的排骨。在这个经典问题上,我的代码遗漏了一个测试用例。 问题如下: 给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。 您可以假设每个输入都有一个精确的解决方案,并且您可以不使用相同的元素两次。 例子: 给定nums=[2,7,11,15],target=9, 因为Nums[0]Nums[1]=2 7=9,返回[0,1]

  • 问题内容: 我认为这可能是一个非常简单的解决方案,但我不太确定。 我正在尝试创建一个字符数组,通过增加数组的特定索引并将它们放在最后的字符串中来对它们进行排序。 我已经做到了这一点(通过将结果打印到控制台进行验证。“ aaaaaaaa”到“ aaaaaaab”,依此类推。但是,我的新版本代码通过ASCII值33-126排序。“!”为“〜” 现在,我想做的一件事是在main方法中调用该字符串,以便我

  • 这道题是 LeetCode 42 题。 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 这道题乍一看和 LeetCode 84 柱状图中最大的矩形很像。事实上,84 题的很多解法都可以套到这道题上。 通用的优化方法 这道题有一个通用的优化方法。把柱子想象成下图的曲线,雨水只能存储在柱子之间的“谷”里,因此可以跳过左侧和右侧的上升坡,只遍历中间的柱

  • 我一直在ACM提交解决这个问题的程序。问题ID=1922,但我的解决方案在测试3中一直超过时间限制。 我的想法是使用蛮力,但有一些分支-切断。以下是我的Java代码,任何更快的解决方案或改进将不胜感激...我猜这一点也不难,因为难度只有195,但我就是不能让它被接受。 终于被接受了。算法是先给英雄排序,先从愿望最小的开始。只是O(n).. 我的Java代码是迄今为止最快的解决方案排名 非常感谢!

  • fn=fn−1+fn−2,其中f1=1和f2=1。因此,前12项将为f1=1,f2=1,f3=2,f4=3,f5=5,f6=8,f7=13,f8=21,f9=34,f10=55,f11=89,f12=144 第12项f12是第一个包含三位数的项。 斐波那契数列中第一个包含1000位数字的项是什么?

  • 我试图配置水槽与HDFS作为汇。 这是我的flume.conf文件: 我的hadoop版本是: 水槽版本是: 我已将这两个jar文件放在flume/lib目录中 我将hadoop common jar放在那里,因为在启动flume代理时出现以下错误: 现在代理开始了。这是启动日志: 但是当一些事件发生时,下面的错误出现在水槽日志中,并且没有任何东西被写入hdfs。 我缺少一些配置或jar文件?