解题思路:
双指针
接水量 = “轮廓”面积 - “柱子”面积的和
我们有双指针从头尾开始遍历整个数组,右指针:从0开始,向左移动,直到遇到第一个大于0的数停下;
左指针:从n-1开始,向左移动,直到遇到第一个大于0的数停下。此时比较height[left]和height[right]的大小,将数组内的所有数减去最小的值,并将减去的部分记录。直到左指针和右指针指向同一个点时结束。
class Solution:
def trap(self, height: List[int]) -> int:
left, right = 0, len(height)-1
area_sum = 0
for i in range(len(height)):
area_sum += height[i]
area = 0
while left < right:
while height[left] <= 0:
left += 1
while height[right] <= 0:
right -= 1
cur_min = min(height[left], height[right])
area += cur_min*(right-left+1)
count = 0
for i in range(len(height)):
height[i] -= cur_min
if height[i] <= 0:
count += 1
if count == len(height):
break
if area - area_sum > 0:
return area - area_sum
else:
return 0