leetcode 42. Trapping Rain Water 动态规划/双指针

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6

暴力枚举 O(n2)O(n^2)

class Solution {
public:
    int trap(vector<int>& a) {
        int n=a.size(),res=0;
        for(int i=1;i<n-1;i++){
            int lm=0,rm=0;
            for(int j=0;j<i;j++)
                lm=max(lm,a[j]);
            for(int j=i+1;j<n;j++)
                rm=max(rm,a[j]);
            int w=min(lm,rm);
            if(w>a[i])res+=w-a[i];
        }
        return res;
    }
};

DP,用两个数组来存放左右的最大高度,时间空间均为 O(n)O(n)

class Solution {
public:
    int trap(vector<int>& a){
        int n=a.size(),res=0;
        if(!n)return 0;
        vector<int> lm(n), rm(n);
        lm[0]=a[0];
        for(int i=1;i<n;i++)lm[i]=max(a[i],lm[i-1]);
        rm[n-1]=a[n-1];
        for(int i=n-2;i>=0;i--)rm[i]=max(a[i],rm[i+1]);
        for(int i=1;i<n-1;i++)
            res+=min(lm[i],rm[i])-a[i];
        return res;
    }
};

试用栈来解决,时间空间 O(n)O(n)

class Solution {
public:
    int trap(vector<int>& a){
        int n=a.size(),res=0,cur=0;
        if(!n)return 0;
        stack<int> s;
        while(cur<n){
            while(!s.empty()&&a[cur]>a[s.top()]){
                int t=s.top();s.pop();
                if(s.empty())break;
                int d=cur-s.top()-1;
                int h=min(a[cur], a[s.top()])-a[t];
                res+=d*h;
            }
            s.push(cur++);
        }
        return res;
    }
};

很妙的双指针法:

class Solution {
public:
    int trap(vector<int>& a){
        int n=a.size(),res=0,cur=0;
        if(!n)return 0;
        int l=0,r=n-1;
        int lm=0,rm=0;
        while(l<r){
            if(a[l]<a[r]){
                a[l]>=lm?(lm=a[l]):res+=lm-a[l];
                l++;
            }else{
                a[r]>=rm?(rm=a[r]):res+=rm-a[r];
                r--;
            }
        }
        return res;
    }
};
posted @ 2020-07-25 15:04  winechord  阅读(95)  评论(0编辑  收藏  举报