每日一题 417. 太平洋大西洋水流问题

417. 太平洋大西洋水流问题

代码使用队列进行广度搜索,分别遍历太平洋 和大西洋的河流,取交集。

class Solution {
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        set<pair<int,int>> pacSet;
        set<pair<int,int>> atlSet;
        vector<vector<int>> ans;

        queue<pair<int,int>> que; 
        int m = heights.size();
        int n = heights[0].size();
        for(int i=0;i<n;++i)
        {
            que.push({0,i});
            pacSet.insert({0,i});
        }
        for(int i=1;i<m;++i)
        {
            que.push({i,0});
            pacSet.insert({i,0});
        }
        int dx[4] = {1,0,-1,0};
        int dy[4] = {0,1,0,-1};
        while(!que.empty())
        {
            auto t = que.front();
            que.pop();

            int x = t.first;
            int y = t.second;
            for(int i=0;i<4;++i)
            {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if(nx>=0 && nx<m && ny>=0 && ny <n && !pacSet.count({nx,ny}) && heights[nx][ny] >= heights[x][y])
                {
                    que.push({nx,ny});
                    pacSet.insert({nx,ny});
                }
            }
        }
        
        for(int i=0;i<n;++i)
        {
            que.push({m-1,i});
            atlSet.insert({m-1,i});
        }

        for(int i=0;i<m-1;++i)
        {
            que.push({i,n-1});
            atlSet.insert({i,n-1});
        }
        
        while(!que.empty())
        {
            auto t = que.front();
            que.pop();

            int x = t.first;
            int y = t.second;
            if(pacSet.count({x,y}))
            {
                ans.push_back({x,y});
            }
            for(int i=0;i<4;++i)
            {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if(nx>=0 && nx<m && ny>=0 && ny <n && !atlSet.count({nx,ny}) && heights[nx][ny] >= heights[x][y])
                {
                    que.push({nx,ny});
                    atlSet.insert({nx,ny});
                }
            }
        }
        return  ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值