高频面试题Leetcode 42 接雨水 面试写法

思路是单独计算每一个格子能解多少雨水,然后加起来。

当前格子能接的雨水数,取绝于左边和右边最远的最大高度和当前高度的差。很容易写出一个O(n^2)的代码,然后如果预处理一个leftMax和rightMax数组,就能把答案优化到O(N)

class Solution {
public:
    int trap(vector<int>& height) {
        int n = height.size();
        int res=0;
        for(int i=1;i<n-1;i++){
            int maxLeft = height[i];
            int maxRight = height[i];
            for(int j=i-1;j>=0;j--) maxLeft = max(maxLeft,height[j]);
            for(int k=i+1;k<n;k++) maxRight = max(maxRight,height[k]);
            res+=(min(maxLeft,maxRight)-height[i]);
        }
        return res;
    }
};
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;
    }
};

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/108418029