1. 程式人生 > >Leetcode 42.接雨水

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,3,2,1,2,1]

輸出: 6

 

 

這道題立馬讓我想到了之前做過的一道求兩條柱子間面積的題。此題使用了類似的方法。我們不用仔細地計算每個"容器的裝水"容量、我們只需要計算裝水前的容器面積和裝滿水後的容器面積之差即可。此題的難點是如何裝滿水成為一個新nums。在此我使用了從頭和尾夾逼的方法,從低往高裝水。裝完一層形成新的陣列再裝下一層~

 

 

 1 public class Solution {
 2     public int trap(int[] height) {
 3         int preS=0;    //原面積
 4         int aftS=0;    //後面積
 5         int pre=0;
 6         int aft=height.length-1;
 7         int temp;
 8         for(int i=0;i<height.length;i++){
 9             preS+=height[i];
10 } 11 while(pre<aft){ 12 if(height[pre]<height[aft]){ 13 temp=height[pre]; 14 }else{ 15 temp=height[aft]; 16 } 17 for(int j=pre+1;j<aft;j++){ 18 height[j]=Math.max(temp, height[j]);
19 } 20 if(height[pre]<height[aft]){ 21 while(pre<aft&&height[pre]<=temp){ 22 pre++; 23 } 24 }else{ 25 while(aft>pre&&height[aft]<=temp){ 26 aft--; 27 } 28 } 29 } 30 for(int i=0;i<height.length;i++){ 31 aftS+=height[i]; 32 } 33 return aftS-preS; 34 } 35 }