接雨水C++多方法题解

42 接雨水

题目链接

方法1:DP状态储存

class Solution {
public:
    int trap(vector<int>& height) {
        int ans=0;
        int len=height.size();
        int l=0,r=len-1;
        vector<int> maxl(len);
        vector<int> maxr(len);
        maxl[0]=height[0];
        maxr[r]=height[r];
        for(int i=1;i<=r;i++){
            maxl[i]=max(maxl[i-1],height[i]);           
        } 
        for(int i=r-1;i>=0;i--){
            maxr[i]=max(maxr[i+1],height[i]);
        }
        for(int i=0;i<=r;i++){
            ans+=min(maxl[i],maxr[i])-height[i]; 
        }
        return ans;
    }
};

方法2:Stack

class Solution {
public:
    int trap(vector<int>& height) {
        int ans=0;
        stack<int>s;
        int n=height.size();
        for(int i=0;i<n;i++){
            while(!s.empty()&&height[i]>height[s.top()]){
                int top=s.top();
                s.pop();
                if(s.empty()) break;
                int l=s.top();
                int curW=i-l-1;
                int curH=min(height[l],height[i])-height[top];
                ans+=curW*curH;
            }
            s.push(i);
        }
        return ans;
    }
};

方法3:双指针

class Solution {
public:
    int trap(vector<int>& height) {
        int ans=0;
        int n=height.size();
        int l=0,r=n-1;
        int maxl=0,maxr=0;
        while(l<r){
            maxl=max(maxl,height[l]);
            maxr=max(maxr,height[r]);
            if(height[l]<height[r]){
                ans+=maxl-height[l];
                l++;
            }
            else
            {
                ans+=maxr-height[r];
                r--;
            }
        }
        return ans;
    }
};

407 接雨水II

题目链接

方法1:优先队列

class Solution {
public:
    int trapRainWater(vector<vector<int>>& heightMap) {
        int m=heightMap.size(), n=heightMap[0].size();
        int vis[m][n];
        memset(vis,0,sizeof(vis));
        typedef pair<int, int>pa;
        priority_queue<pa,vector<pa>,greater<pa>>pq;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(i==0||i==m-1||j==0||j==n-1){
                    pq.push(make_pair(heightMap[i][j],i*n+j));
                    vis[i][j]=1;
                }
            }
        }
        int ans=0;
        int dir[]={-1,0,1,0,-1};
        while(!pq.empty()){
            pa cur=pq.top();
            pq.pop();
            for(int k=0;k<4;k++){
                int nx=cur.second/n+dir[k];
                int ny=cur.second%n+dir[k+1];
                if(nx>=0&&nx<m&&ny>=0&&ny<n&&!vis[nx][ny]){
                    if(heightMap[nx][ny]<cur.first){
                        ans+=cur.first-heightMap[nx][ny];                        
                    }
                    pq.push(make_pair(max(cur.first,heightMap[nx][ny]),nx*n+ny));
                    vis[nx][ny]=1;
                }
            }
        }
        return ans;
    }
};

方法2:广搜

class Solution {
public:
    int trapRainWater(vector<vector<int>>& heightMap) {
        int m=heightMap.size(),n=heightMap[0].size();
        int maxH=0;
        int dir[]={-1,0,1,0,-1};
        for(int i=0;i<m;i++){
            maxH=max(*max_element(heightMap[i].begin(),heightMap[i].end()),maxH);
        }
        int water[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                water[i][j]=maxH;
            }
        }
        //vector<vector<int>>water(m,vector<int>(n,maxH);
        queue<pair<int,int>>qu;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(i==0||i==m-1||j==0||j==n-1){
                    if(water[i][j]>heightMap[i][j]){
                        water[i][j]=heightMap[i][j];
                        qu.push(make_pair(i,j));
                    }
                }
            }
        }
        while(!qu.empty()){
            int x=qu.front().first;
            int y=qu.front().second;
            qu.pop();
            for(int k=0;k<4;k++){
                int nx=x+dir[k];
                int ny=y+dir[k+1];
                if(nx<0||nx>=m||ny<0||ny>=n) continue;
                if(water[x][y]<water[nx][ny]&&water[nx][ny]>heightMap[nx][ny]){
                    water[nx][ny]=max(water[x][y],heightMap[nx][ny]);
                    qu.push(make_pair(nx,ny));
                }
            }
        }
        int ans=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                ans+=water[i][j]-heightMap[i][j];
            }
        }
        return ans;
    }
};
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值