C++ leetcode接雨水
阿新 • • 發佈:2020-08-21
雙指標演算法“接雨水”
連結:https://leetcode-cn.com/problems/trapping-rain-water/
給定n個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
上面是由陣列 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。
輸入: [0,1,0,2,1,0,1,3,2,1,2,1] 輸出: 6
class Solution { public: int trap(vector<int>& height) {View Codeint left = 0; int right = height.size() - 1; int left_bar_max = 0; int right_bar_max = 0; int ans = 0; //左指標、右指標重合跳出迴圈返回答案 while(left < right) { //左邊高度小於右邊高度,便從左到右遍歷 if(height[left] < height[right]) {//左指標高度大於左邊最大高度,將左邊最大高度更新成左指標指向的高度 if(height[left] > left_bar_max) { left_bar_max = height[left]; } else { ans += left_bar_max - height[left]; } left++; } else { if(height[right] > right_bar_max) { right_bar_max = height[right]; } else { ans += right_bar_max - height[right]; } right--; } } return ans; } };
雙指標解題思路:
left :從左到右的陣列下標 right:從右到左的陣列下標 left_bar_max:左邊的最大值 right_bar_max:右邊的最大值當right_bar_max>left_bar_max,積水高度將由 left_bar_max 決定,類似地 left_bar_max>right_bar_max 積水的高度將由 right_bar_max 決定。
所以我們可以認為如果一端有更高的條形塊(例如右端),積水的高度依賴於當前方向的高度(從左到右)。當我們發現另一側(右側)的條形塊高度不是最高的,我們則開始從相反的方向遍歷(從右到左)。
我們必須在遍歷時維護left_bar_max 和right_bar_max,但是我們現在可以使用兩個指標交替進行,實現 1 次遍歷即可完成
right_bar_max
left_bar_max __ __ | | | |__ __?????????????????????? | | __| |__| __| |__ left right