87 lines
2.2 KiB
Python
87 lines
2.2 KiB
Python
# def trap(height):
|
|
# n = len(height)
|
|
# rain = 0
|
|
# l = 0
|
|
# r = n - 1
|
|
# l_max = height[l]
|
|
# r_max = height[r]
|
|
|
|
# while l < r-1:
|
|
# l += 1
|
|
# if height[l] > l_max:
|
|
# l_max = height[l]
|
|
# else:
|
|
# rain += l_max - height[l]
|
|
# print(rain)
|
|
# r -= 1
|
|
# if height[r] > r_max:
|
|
# r_max = height[r]
|
|
# else:
|
|
# rain += r_max - height[r]
|
|
# print(rain)
|
|
# return rain
|
|
def sumBackets(self, height: list[int], left, right):
|
|
|
|
minHeightLeft = height[left]
|
|
total = 0
|
|
leftBacket = 0
|
|
locationMinLeft = left
|
|
|
|
while left < right:
|
|
|
|
if height[left] < minHeightLeft:
|
|
leftBacket += minHeightLeft - height[left]
|
|
else:
|
|
minHeightLeft = height[left]
|
|
total += leftBacket
|
|
leftBacket = 0
|
|
locationMinLeft = left
|
|
left += 1
|
|
|
|
if minHeightLeft <= height[right]:
|
|
return total + leftBacket, right
|
|
else :
|
|
return total, locationMinLeft
|
|
|
|
|
|
def sumBacketsReverce(self, height: list[int], left, right):
|
|
|
|
minHeightRight = height[right]
|
|
total = 0
|
|
rightBacket = 0
|
|
locationMinRight = right
|
|
|
|
while left < right:
|
|
|
|
if height[right] < minHeightRight:
|
|
rightBacket += minHeightRight - height[right]
|
|
else :
|
|
minHeightRight = height[right]
|
|
total += rightBacket
|
|
rightBacket = 0
|
|
locationMinRight = right
|
|
right -= 1
|
|
|
|
if minHeightRight <= height[left]:
|
|
return total + rightBacket, left
|
|
else :
|
|
return total, locationMinRight
|
|
|
|
|
|
def trap(self, height: list[int]) -> int:
|
|
right = len(height)-1
|
|
left =0
|
|
totalSum =0
|
|
|
|
|
|
while left < right-1:
|
|
if( height[left]< height[right]):
|
|
total, left = self.sumBackets(height, left, right)
|
|
else:
|
|
total, right = self.sumBacketsReverce(height, left, right)
|
|
|
|
totalSum += total
|
|
return totalSum
|
|
|
|
# print(trap([0,1,0,2,1,0,1,3,2,1,2,1])) # Output: 6
|
|
print(trap([4,2,0,3,2,5])) # Output: 9 |