給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
示例 1:
輸入:height = [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 個單位的雨水(藍色部分表示雨水)。
示例 2:
輸入:height = [4,2,0,3,2,5]
輸出:9
#include
//接雨水
intmin
(int a,
int b)
inttrap
(int
* height,
int heightsize)
int left =0;
int right = heightsize -1;
int max_high = height[0]
;int max_pos =0;
for(
int i =
1; i < heightsize;i++
)//找到峰值最高的點,以它為標誌點,從兩邊開始向它靠攏,因為我們知道它一定是一面合格的水池的牆
}//得到最高長度及其座標
printf
("############################left#################################\n");
int lr;
int all_height_l =0;
int wall_size =0;
while
(left < max_pos)
#if 0|||
| 說明都是這種情況||
||#endif
if(left == max_pos)
lr = left+1;
//最終找到一堵比左牆矮的牆
while
(lr <= max_pos && height[lr]
< height[left]
)//找到下一堵牆,使之得能積水
//以下是計算積水面積的公式,我們先計算出左右兩面牆之間的牆體佔的體積
for(
int k = left;k <= lr;k++
)else
}//(lr - left+1)*min(height[lr],height[left]),左右牆形成的矩形,面積為兩面牆的寬乘高(左右兩高的較小高)
all_height_l +
=(lr - left+1)
*min
(height[lr]
,height[left]
)- wall_size;
//再減去實體牆佔的空間,就得到水的面積
printf
("wall_size: %d,all_height_l:%d\n"
,wall_size,all_height_l);
left = lr;
wall_size =0;
}printf
("\n\n############################right#################################\n");
int rl;
int all_height_r =0;
while
(max_pos < right)
#if 0|||
| 說明都是這種情況 |||||
#endif
if(right == max_pos)
rl = right-1;
while
(rl >= max_pos && height[rl]
< height[right]
)//我們知道max_pos一定為合格的牆,所以rl可以等於max_pos,當它等於max_pos時說明它是最後乙個窪地
for(
int k = rl;k <= right;k++
)else}
all_height_r +
=(right - rl+1)
*min
(height[rl]
,height[right]
)- wall_size;
printf
("wall_size: %d,all_height_r:%d\n"
,wall_size,all_height_r)
;
right = rl;
wall_size =0;
}return all_height_r + all_height_l;
}int
main()
;//int height = ;
//int height = ; //ok
//int height = ;
int height=
;int heightsize =
sizeof
(height)
/sizeof
(height[0]
);int ret =
trap
(height,heightsize)
;printf
("\n\n\nresult:%d\n"
,ret)
;return0;
}
這種題,從邏輯角度算不上難,但是從手敲**來看,很複雜,如何用乙個統一的**去將這個簡單的邏輯實現,去完成所有的測試用例,那麼就比較複雜了。
1.首選,我們先從給定的牆座標中,找到最高的牆及其所處的位置
int max_high = height[0]
;int max_pos =0;
for(
int i =
1; i < heightsize;i++
)//找到峰值最高的點,以它為標誌點,從兩邊開始向它靠攏,因為我們知道它一定是一面合格的水池的牆
}//得到最高長度及其座標
以上**,我們就能找到最高的牆的座標位置max_pos,我們為什麼要找到它?因為我們的積水條件,是,我們必須有窪地,必須有兩面牆之間形成窪地。所以找到最高的牆,就能保證我們積水形成所需要兩面牆的一面已經有把握了。
這樣,我們從左邊到max_pos開始,找所有的窪地,每找到乙個窪地,我們就計算其積水面積,計算完成後,我們就接著找下乙個,直到最後乙個以max_pos為右牆的窪地。同理,從右邊開始找窪地,直到最後乙個以max_pos為左牆的窪地結束。
力扣 42 接雨水
題目 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos 貢獻此圖。示例 輸入 0,1,0,2,1,...
力扣第42題 接雨水
原文是帶著講解,過程還算詳細 上題是乙個對題目的舉例說明 本次解題中用這個圖 我認為這個圖涵蓋了可能出現的情況,講解會比較好一點 第一種方法是暴力法,時間複雜度為o n 2 空間複雜度為o 1 public inttrap02 int height int max right 0 找出右邊最高 fo...
力扣 42 接雨水 常考
題目 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。示例 1 輸入 height 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 ...