我一直在研究以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))
答案 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:])