#最近的算法都是考查思维而不是特定算法,值得一试
#按层
class Solution:
def trap(self, height: List[int]) -> int:
n=len(height)
left,right=0,n-1
tmp,high=0,1
while(left<=right):
while(left<=right and height[left]<high):
left+=1
#动态规划- 状态转移方程-求每柱的左右侧最大高度
#想法求出每个左右最大高度,再用最小的去减去现在高度因为能接住水的是最短的那条
class Solution:
def trap(self, height: List[int]) -> int:
n = len(height)
max_left = [height[0]] * n
max_right = [height[-1]] * n
res = 0
for i in range(1, n):
max_left[i] = max(max_left[i - 1], height[i])
max_right[n - i - 1] = max(max_right[n - i], height[n - i - 1])
for i in range(n):
res += min(max_left[i], max_right[i]) - height[i]
return res
# 双指针
ans = 0
left, right = 0, len(height) - 1
leftMax = rightMax = 0
while left < right:
leftMax = max(leftMax, height[left])
rightMax = max(rightMax, height[right])
if height[left] < height[right]:
ans += leftMax - height[left]
left += 1
else:
ans += rightMax - height[right]
right -= 1
return ans