力扣407. 接雨水Ⅱ 最短路迪杰斯特拉 优先队列 + 贪心

43 篇文章 1 订阅

题目

在这里插入图片描述
在这里插入图片描述

题解思路

学长讲的真的好
在这里插入图片描述
把高度看成最短路,最短的点延申出的必然是最短路。

AC代码
#define PII pair< int, pair<int ,int > > 

class Solution {
public:
    int trapRainWater(vector<vector<int>>& heightMap) {
        int n = heightMap.size() , m = heightMap[0].size() ;
        vector<vector<int>>& a = heightMap ; 
        int dx[4] = { 0 , 0 , -1 , 1 } ;
        int dy[4] = { 1 , -1 , 0 , 0 } ;
        long long ans = 0 ; 
        int vis[n][m] ; 
        priority_queue < PII , vector<PII> , greater<PII> > q ; 
        for (int i = 0 ; i < n  ; i++ )
            for (int j = 0 ; j < m  ; j++ )
                vis[i][j] = 0 ; 
        for (int i = 0 ; i < n  ; i++ )
        {
            for (int j = 0 ; j < m  ; j++ )
            {
                if ( i == 0 || j == 0 || i == n-1 || j == m -1 )
                {
                    q.push({a[i][j] , {i,j} }) ;
                    vis[i][j] = 1 ;
                }
            }
        }
        while (!q.empty())
        {
            auto tmp = q.top();
            q.pop();
            int tx = tmp.second.first ;
            int ty = tmp.second.second ; 
            int mi = 1e6 ; 
            for (int i = 0 ; i < 4 ; i++ )
            {
                int fx = tx + dx[i] ;
                int fy = ty + dy[i] ; 
                if ( fx >= 0 && fy >= 0 && fx < n && fy < m && !vis[fx][fy] )
                {
                    if ( a[fx][fy] < tmp.first )
                    {
                        ans += tmp.first - a[fx][fy] ; 
                    }
                    vis[fx][fy] = 1 ;
                    q.push({ max( a[fx][fy] , tmp.first  ) , {fx,fy} } ) ; 
                }
            }
        }
        return ans ; 
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值