心路历程:
这道题很久之前在看数组前缀的专题的时候见过,是一道典型的用数组前缀最大值来解决问题的题。感觉应该算是贪心思维吧。凭着之前记着的求解思路把这道题写了出来,说实话要是没遇到过这种类型的第一次见的话自己想出来这个贪心解法还是有点困难的。
注意的点:
1、在求后缀最大值时,最好采用post_max[i] = x的赋值方式而不是post_max.append(x)
解法:贪心+数组前后缀最大值
class Solution:
def trap(self, height: List[int]) -> int:
# 前缀和和后缀和解决
n = len(height)
premax, postmax = [0]*n, [0]*n # 这块最好别用append方法
premax_res, postmax_res = height[0], height[-1]
for i in range(n):
premax_res = max(premax_res, height[i])
premax[i] = premax_res
for i in range(n-1, -1, -1):
postmax_res = max(postmax_res, height[i])
postmax[i] = postmax_res
res = 0
for i in range(n):
h = min(premax[i], postmax[i])
delta_h = max(0, h - height[i])
res += delta_h * 1
# print(i, delta_h, premax[i], postmax[i])
return res