1. 程式人生 > 實用技巧 >C++ leetcode接雨水

C++ leetcode接雨水

雙指標演算法“接雨水”

連結: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) {
        
int 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; } };
View Code

雙指標解題思路:

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