接雨水

題目

來源:力扣(LeetCode)
鏈接:接雨水

分析

計算每個位置可以積累的水柱高度,需要分別計算位置i左右兩邊的所有柱子中的最高柱子的高度。

可以利用動態規劃的思想,使用兩個數組動態的存儲從柱子0到柱子i的最大高度、從柱子n-1到柱子i的最大高度,分別記爲max_left[],max_right[]。
在這裏插入圖片描述
如上圖柱子1的高度爲3,左邊最高的柱子高度爲5,右邊最高的柱子高度爲6,在柱子1中可以積水的高度爲min(5,6)-3=2。
所有情況爲下表

i 0 1 2 3 4 5 6 7 8
max_left[i] 5 5 5 5 5 6 6 6 6
max_right[i] 6 6 6 6 6 6 5 2 2
min(max_left[i],max_right[i]) 5 5 5 5 5 6 5 2 2

代碼

int min(int a,int b){
    return a<b?a:b;
}
int trap(int* height, int heightSize){
    int* max_left=(int*)malloc(sizeof(int)*heightSize);
    int* max_right=(int*)malloc(sizeof(int)*heightSize); 
    int sumWarter=0;
    int max=0;
    for(int i=0;i<heightSize;i++){
        if(height[i]>max){
            max=height[i];
        }
        max_left[i]=max;
    }
    max=0;
    for(int j=heightSize-1;j>=0;j--){
        if(height[j]>max){
            max=height[j];
        }
        max_right[j]=max;
    }
    for(int i=0;i<heightSize;i++){
        sumWarter+=min(max_left[i],max_right[i])-height[i];
    }
    free(max_left);
    free(max_right);
    return sumWarter;
}
發佈了38 篇原創文章 · 獲贊 13 · 訪問量 4029
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章