力扣的接雨水解法
题目描述:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
参考程序1:
class Solution:
def trap(self, height: List[int]) -> int:
temp = 0
height1 = 0
height2 = 0
for i in range(len(height)):
height1 = max(height1,height[i])
height2 = max(height2,height[-i-1])
temp = temp + height1 + height2 -height[i]
result=temp- len(height)*height1
return result
运行结果1:
参考程序2:
class Solution:
def trap(self, height: List[int]) -> int:
def BS(height_list):
heightmax, result = 0, 0
for cur_height in height_list:
if cur_height >= heightmax: # 这时候不存水
heightmax = cur_height
else: # 这时候存水
result = result + (heightmax - cur_height)
return result
indexmax = 0
for i in range(len(height)): # 找到最右边的最大值
if height[i] >= height[indexmax]:indexmax = i
indexmax = min(indexmax,len(height)-1)
return BS(height[:indexmax+1]) + BS(reversed(height[indexmax+1:]))
运行结果2:
参考程序3:
class Solution:
def trap(self, height: List[int]) -> int:
if not height or len(height) < 3:
return 0
result = 0
left, right = 0, len(height) - 1
leftmax, rightmax = height[left], height[right]
while left < right:
leftmax, rightmax = max(height[left], leftmax), max(height[right], rightmax)
if leftmax <= rightmax:
result += leftmax - height[left]
left += 1
else:
result += rightmax - height[right]
right -= 1
return result
运行结果3: