# 方法一 暴力法
def trap(height):
ans = 0
size = len(height)
for i in range(1, size-1):
max_left = 0
max_right = 0
for j in range(i,-1, -1):
max_left = max(max_left, height[j])
for j in range(i,size):
max_right = max(max_right, height[j])
ans += min(max_left, max_right) - height[i]
return ans
# 方法二 动态编程
def trap(height):
if height is None:
return 0
ans = 0
size = len(height)
left_max = []
right_max = []
for i in range(size):
right_max.append(height[i])
left_max.append(height[i])
for i in range(1, size):
left_max[i] = max(left_max[i-1], height[i])
right_max[size-1] = height[size-1]
for i in range(size-2, -1, -1):
right_max[i] = max(height[i], right_max[i+1])
for i in range(1, size-1):
ans += min(left_max[i], right_max[i]) - height[i]
return ans
# 方法三 栈的应用
def trap(height):
ans = 0
current = 0
stack = []
while current < len(height):
while stack and height[current] > height[stack[-1]]:
top = stack[-1]
stack.pop()
if len(stack)==0:
break
distance = current - stack[-1] - 1
bounded_height = min(height[current], height[stack[-1]])-height[top]
ans += distance*bounded_height
stack.append(current)
current += 1
return ans
height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
print(trap(height))
42_接雨水
最新推荐文章于 2022-08-31 22:27:57 发布