給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
上面是由陣列 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。 感謝 marcos 貢獻此圖。
示例:
輸入: [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6
按列來做。每乙個柱子上面可以儲存的水的容量由該柱子左右兩邊最長的柱子之間最短的那個柱子決定。例如,
我們當前的柱子的高度為 height[i]=1,height[i] 左邊最高的柱子的高度為 2,height[i] 右邊最高的柱子的高度為 3,兩者之間的較小值為 2,而當前柱子的高度為 1,則當前柱子上能儲存 2-1 = 1 個單位的水,這是當前柱子的高度小於等於左右兩個柱子之間較小值的情況。如果較小值小於當前柱子的高度,水會漏掉,所以當前柱子上不能儲存水,則就是儲存水的單位為 0,如下所示:
由於第乙個柱子和最後乙個柱子位於邊界,不會儲存水,所以遍歷時從第乙個柱子開始,到倒數第二個柱子結束。
所以演算法如下:
**如下:
class solution
int rightmax = 0;
for(int j=i+1; jrightmax) rightmax = height[j];
}int minheight = min(leftmax, rightmax);
if(minheight>height[i]) ans += (minheight - height[i]);
}return ans;}};
思路 1 有乙個缺點,就是每次都要從當前元素分別向左右遍歷來尋找左邊和右邊的最大高度,這增加了時間複雜度。可以用 leftmax[i] 和 rightmax[i] 分別表示 height[i] 左邊和右邊的最大高度。我們提前通過動態規劃計算好這兩個陣列。以 leftmax 為例:
其他步驟和思路 1 一致,**如下:
class solution
int ans = 0;
for(int i=1; iheight[i]) ans += (minheight-height[i]);
}
return ans;}};
使用單調棧來做,具體是單調遞減棧。單調遞減棧中的元素從棧底到棧頂依次遞減。因為要計算寬度,所以棧中儲存的是下標,而不是高度。
具體細節如下:
class solution ;
int ans = 0;
stacks;
for(int i=0; i個人覺得單調棧不是很好寫,很容易出錯。
使用類似於韋恩圖的方法來做。首先從左到右計算面積,記為 leftarea:
然後從右到左計算面積,記為 rightarea:
這樣,leftarea + rightarea 會覆蓋整個矩形:
在上圖中,柱子以及陰影部分都被計算了兩次,所以有,leftarea + rightarea = 粉色面積 + 綠色面積 + 柱子面積 + 陰影面積 + 柱子面積 + 陰影面積 = 矩形面積 + 柱子面積 + 陰影面積(前面四項合併)。所以,陰影面積 = leftarea + rightarea - 矩形面積 - 柱子面積。
**如下:
class solution ;
int leftarea = 0;
int curleftmax = 0;
for(int i=0; i=0; i--)
int pillararea = 0; // 柱子面積
for(int i=0; i
return leftarea + rightarea - pillararea - height.size() * curleftmax;}};
演算法 陣列 接雨水
動態規劃記錄當前位置左邊最大的數 for int i 1 i size 2 i rightmax size 1 height size 1 動態規劃記錄當前位置右邊最大的數 for int j size 2 j 1 j 左邊最大的和右邊最大的取兩者較小的減去自己 for int i 1 i size...
LeetCode刷題 接雨水
給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 時間複雜度o n 空間複雜度o n int trap vector ...
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...