---
# System prepended metadata

title: Leetcode 42. Trapping Rain Water
tags: [Leetcode(C++)]

---

# Leetcode 42. Trapping Rain Water
###### tags: `Leetcode(C++)`

題目 : https://leetcode.com/problems/trapping-rain-water/ 。

想法 : 

    找到每一個位置的左方最大與右方最大，它的蓄水高度就是兩者取小減掉自己本身的高度。
    所以先找所有位置的左方最大，並找右方最大。
    接著再跑一次總合即為答案。

時間複雜度 : O(n)。

程式碼 :

```
class Solution {
public:
    int trap(vector<int>& height) {
        int l=height.size(), sum=0, left_max[20010]={0}, right_max[20010]={0};
        
        left_max[0]=height[0];
        for(int i=1 ; i<l ; i++){
            left_max[i]=max(left_max[i-1], height[i]);
        }
        
        right_max[l-1]=height[l-1];
        for(int i=l-2 ; i>=0 ; i--){
            right_max[i]=max(right_max[i+1], height[i]);
        }
        
        for(int i=0 ; i<l ; i++){
            sum+=(min(left_max[i], right_max[i]) - height[i]);
        }
        
        return sum;
    }
};
```