Leetcode42 接雨水 雙指標法

2021-10-01 22:59:48 字數 1150 閱讀 4381

本題是這樣的:

42.接雨水

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。

題目給出的一眼就能了然題目要問的是什麼。

很明顯,某一列能裝多少水,取決於該列左側和右側的高度的最小值。

最無腦的做法就是,對每一列求其左右的最大值,也就是用額外的兩個o(n)大小的陣列空間來儲存每一列的最大值和最小值。

該方法時間複雜度也是o(n),不過是需要2-3次遍歷陣列(求最大值一次,最小值一次,然後求盛水高度一次,後面兩次可以合併)。

不過,我希望能夠一次遍歷完成計算,並且不需要使用額外的陣列空間,一開始我是這樣寫的:

class

solution

}return output;

}}

這樣寫,值考慮左側的值,並沒有考慮右側值是否比左側值更小,當然是錯的。不過提供了一種思路,是否能夠用相似的方法一次遍歷並且不實用額外的陣列空間呢?

由之前的解法,我們看到,只考慮了一側的值(左側),而忽略了另一側的值,這樣是不可取的。因為水位高度取決於最低的那塊板子。

所以,我們想到,是否能用雙指標,分別來指向左右兩側,然後比較左側目前的max_height大還是右側目前的max_height大。其具體步驟是這樣的:

left=0, right=length-1;//兩個指標從左右分別開始。

left_max_height=height[left],right_max_height=height[right];記錄下左右兩邊的目前指標指向的最高的高度。

當left不妨假設是左邊的最大高度小一點,判斷目前的height和left_max_height的關係。如果目前的高度比left_max_height高度更高,再次進入步驟3。否則計算盛水量:left_max_height-height。指標left++,重複步驟4直到不滿足left

else

++left;

}else

else

--right;}}

return ans;

}

LeetCode 42 接雨水 雙指標

主要方法 雙指標 正反遍歷 解釋說明 1.正向遍歷 先確定池子左牆初始化為第乙個bar,從第 2 個 bar 開始遍歷右牆,同時記錄中間的 bar 高度和,當右牆大於等於左牆的時候就有第一灘積水了,左右牆距離 左牆高度 中間 bar 和 就是這灘積水的體積,同時將右牆認定為下乙個左牆,同時重新記錄b...

LeetCode 42 接雨水 困難

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos 貢獻此圖。示例 輸入 0,1,0,2,1,0,1...

(LeetCode 42)接雨水 思維題

42.接雨水 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos 貢獻此圖。示例 輸入 0,1,0,...