LeetCode 417. 太平洋大西洋水流問題【dfs】

題目描述

給定一個 m x n 的非負整數矩陣來表示一片大陸上各個單元格的高度。“太平洋”處於大陸的左邊界和上邊界,而“大西洋”處於大陸的右邊界和下邊界。

規定水流只能按照上、下、左、右四個方向流動,且只能從高到低或者在同等高度上流動。

請找出那些水流既可以流動到“太平洋”,又能流動到“大西洋”的陸地單元的座標。

提示:

輸出座標的順序不重要
m 和 n 都小於150

示例:

給定下面的 5x5 矩陣:
太平洋 ~ ~ ~ ~ ~
~ 1 2 2 3 (5) *
~ 3 2 3 (4) (4) *
~ 2 4 (5) 3 1 *
~ (6) (7) 1 4 5 *
~ (5) 1 1 2 4 *
* * * * * 大西洋
返回:
[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上圖中帶括號的單元).

解題思路

雖然題目要求的是滿足向下流能到達兩個大洋的位置,如果我們對所有的位置進行搜索,那麼在不剪枝的情況下複雜度會很高。

因此我們可以反過來想,從兩個大洋開始向上流,這樣我們只需要對矩形四條邊進行搜索。搜索完成後,只需遍歷一遍矩陣,滿足條件的位置即爲兩個大洋向上流都能到達的位置。

AC

class Solution {
public:
    vector<int> dir{-1,0,1,0,-1};
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {
        if(matrix.empty() || matrix[0].empty()) return {};
        vector<vector<int>> ans;
        int n=matrix.size(),m=matrix[0].size();
        vector<vector<bool>> canReachT(n,vector<bool>(m,false));
        vector<vector<bool>> canReachD(n,vector<bool>(m,false));
        for(int i=0;i<n;i++){
            dfs(matrix,canReachT,i,0);
            dfs(matrix,canReachD,i,m-1);
        }
        for(int i=0;i<m;i++){
            dfs(matrix,canReachT,0,i);
            dfs(matrix,canReachD,n-1,i);
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(canReachT[i][j] && canReachD[i][j]){
                    ans.push_back(vector<int>{i,j});
                }
            }
        }
        return ans;
    }
    void dfs(vector<vector<int>>& matrix,vector<vector<bool>>& canReach,int x,int y){
        if(canReach[x][y]) return;
        canReach[x][y]=true;
        int xx,yy;
        for(int i=0;i<4;i++){
            xx=x+dir[i],yy=y+dir[i+1];
            if(xx>=0&&xx<matrix.size() && yy>=0&&yy<matrix[0].size() && matrix[x][y]<=matrix[xx][yy])
            dfs(matrix,canReach,xx,yy);
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章