Leetcode 42接雨水(從暴力開始優化,難度偏大)

 如果一開始就想雙指針之類O(N)的算法是很困難的,先想想最暴力的做法:

單獨計算每一個位置可以接多少水?每次單獨向左向右遍歷:先找到左邊和右邊的最大值,在取最小值即可。時間複雜度是O(N^2)

class Solution {
public:
    int trap(vector<int>& height) {
        // 統計每一個格子可以解多少雨水
        int n = height.size(), res = 0;
        for(int i=1;i<n;i++){
            int leftmax = 0, rightmax = 0;
            for(int j=i;j>=0;j--) leftmax = max(leftmax,height[j]);
            for(int j=i;j<n;j++) rightmax = max(rightmax,height[j]);
            res+=min(leftmax,rightmax) - height[i];
        }
        return res;
    }
};

怎麼優化,很簡單,空間換時間,先遍歷一遍,預處理每一個格點左邊和右邊的最大值的最小值,然後再來做,這樣就能把時間複雜度優化到O(N)

class Solution {
public:
    int trap(vector<int>& height) {
        int n = height.size(), res = 0;
        vector<int> maxLeftHeight(n,0), maxRightHeight(n,0);
        int maxLeft=0, maxRight=0;
        for(int i=0;i<n;i++) {
            maxLeftHeight[i] = max(maxLeft, height[i]);
            maxLeft = max(maxLeft,height[i]);
        }
        for(int i=n-1;i>=0;i--){
            maxRightHeight[i] = max(maxRight, height[i]);
            maxRight = max(maxRight,height[i]);
        }
        for(int i=0;i<n;i++) res+=(min(maxLeftHeight[i],maxRightHeight[i])-height[i]);
        return res;
    }
};

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章