思路說明:
把每一個非零列看成不同高度的長條積木:先把積木全拿走(后面的操作會按原來的高矮順序排列),然后把最左側與最右側的積木先放回去,這樣就能開始積水了冷尉。由于積水量是由矮的那側決定豁跑,那么繼續(xù)由矮的那側開始向另一側把原來的積木放回來,這有兩種情況:若新積木比它所在側的最高積木要低(那一定比另一側的也低典蝌,前面說了曙砂,本側是矮的那側),那它上面就一定能積水了赠法,而且積水量不會被后面放回來的積木影響麦轰;若新積木不比最高的低,那它上面就積不了水了(它所在那側沒積木幫它把水攔鬃┲)款侵,積水量為0。這兩種情況都可以確定本次放回的積木上能積多少水侧纯。這樣就可以實現一邊遍歷一邊統計了新锈,重要前提是兩邊先放好了積木,確保能積水眶熬,每次由矮的那側向中間統計
class Solution:
def trap(self, height: List[int]) -> int:
length = len(height)
if length < 1:
return 0
leftMax = 0
rightMax = 0
leftP = 0
rightP = len(height) - 1
leftValue = height[leftP]
rightValue = height[rightP]
count = 0
while leftP < rightP: # 每次只會在矮的那側操作妹笆,高的那側會負責把水攔住
if leftValue < rightValue:
if leftValue < leftMax:
count += leftMax - leftValue
else: # 刷新最高點時,本例是蓄不了水的
leftMax = leftValue
leftP += 1
leftValue = height[leftP]
else:
if rightValue < rightMax:
count += rightMax - rightValue
else:
rightMax = rightValue
rightP -= 1
rightValue = height[rightP]
return count