力扣c語言實現 42 接雨水

2021-10-22 09:09:29 字數 3422 閱讀 8956

給定 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 ...