給定 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
思路:
1:找到和當前能和當前位置形成最大凹槽的位置
有兩種情況
1. 能找到比當前位置高的位置
2. 找不到比當前高的位置
2. 計算每個凹槽的容量
1 int trap(vector<int>& height) { 2 int ans = 0, len = height.size(); 3 4 for(int i = 0; i < len-1; i++) { 5 int j = i+1, max = j, sum = 0; 6 //起始位置為0,以及起始位置相鄰位置更高都直接進行下一個, 這些情況下,無法接雨水 7 if(height[i] == 0 && height[j] >= height[i]) continue; 8 //找到比當前位置更高或相同高度的位置 9 while(j < len && height[j] < height[i]) { 10 //存在這樣的情況,當前位置后面不存在比當前位置高的位置 11 //那么只能退而求其次,找到當前位置后面最高的位置,這樣 12 //才能滿足接的雨水最多 13 if(height[max] <= height[j]) max = j; 14 //把當前位置和目標位置之間的方塊數加起來 15 //當前位置和目標位置之間的面積減去之間的方塊數 16 //就是能接的雨水數目 17 sum += height[j]; 18 j++; 19 } 20 //能找到不比當前位置低的位置 21 if(j < len) { 22 ans += height[i]*(j-i-1) - sum; 23 i = j-1; 24 } else if(max != i+1){//找不到比當前位置高的位置 25 int sum1 = 0; 26 for(int m = i+1; m <= max; m++) sum1 += height[m]; 27 ans += (height[max]*(max-i)-sum1); 28 i = max-1; 29 } 30 } 31 return ans; 32 }