本題是這樣的:
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,...