42. Trapping Rain Water
阿新 • • 發佈:2021-01-09
技術標籤:Two Pointerleetcode
42. Trapping Rain Water
categories: [LeetCode]
tags: [array, two poiners, easy]
42. Trapping Rain Water
題目大意:
給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
解題思路:
這道題我們可以用雙指標一次遍歷去做,我們分別用left和right代表陣列兩端 同時初始化三個自變數ans,leftmax 和rightmax代表最後答案,左邊最大蓄水量,右邊最大蓄水量 然後開始用while loop迴圈,條件是left < right 如果當前left柱子的高度小於right柱子的高度, 我們需要繼續判斷如果當前left柱子高度大於等於 當前左邊最大蓄水量leftmax,我們需要更新一下leftmax使其等於當前left柱子的高度 否則則說明當前left柱子高度下於leftmax,則當前需水量ans += leftmax - left柱子的高度 無論left高度和leftmax比較如何,我們都需要將left指標挪到下一個left++ 如果當前left的高度大於等於right的高度,我們則需要更新rightmax和看看right這邊有沒有可以蓄水的 同樣的,如果right高度大於等於rightmax,rightmax 更新為right高度 否則說明當前right高度小於rightmax, 可以蓄水,蓄水量為ans += rightmax - right高度 無論right高度和rightmax比較如何,right指標都移到下一個right-- while loop結束,最後返回ans 注意: ans初始化要在while loop之前
注意:
None
複雜度:
Time Complexity:O(N)
Space Complexity: O(1)
Code示例:
class Solution { public int trap(int[] height) { int left = 0, right = height.length - 1; int ans = 0; int left_max = 0, right_max = 0; while (left < right) { if (height[left] < height[right]) { if (height[left] >= left_max) { left_max = height[left]; } else { ans += (left_max - height[left]); } ++left; } else { if (height[right] >= right_max) { right_max = height[right]; } else { ans += (right_max - height[right]); } --right; } } return ans; } }