417. 太平洋大西洋水流問題 Medium

zhuiguang3494發表於2020-11-17

Leetcode筆記目錄


一、題目描述

給定一個 m x n 的非負整數矩陣來表示一片大陸上各個單元格的高度。“太平洋”處於大陸的左邊界和上邊界,而“大西洋”處於大陸的右邊界和下邊界。
規定水流只能按照上、下、左、右四個方向流動,且只能從高到低或者在同等高度上流動。
請找出那些水流既可以流動到“太平洋”,又能流動到“大西洋”的陸地單元的座標。
在這裡插入圖片描述

二、解題過程

1.思想

思想比較難想到,如果遍歷每個點代價會很大,但如果從周圍的大洋四個邊逆推dfs則可以完成目標:

  • 題目要求能流到大西洋和太平洋,因此設定兩個visited陣列,只有滿足條件後才visit;
  • 分別遍歷四條邊,並以四條邊上的每個點做起點進行dfs,根據依靠大洋的不同更新相應的visited陣列。
  • 兩個visited陣列都true的點是符合條件的點。

2.程式碼

    int derict[5]={-1,0,1,0,-1};
    void dfs(vector<vector<int>>& matrix,vector<vector<bool>>& can,int r,int c){
        if(can[r][c])return;
        can[r][c]=true;
        int x,y;
        for(int i=0;i<4;i++){
            x=r+derict[i];y=c+derict[i+1];
            if(x>=0&&x<matrix.size()&&y>=0&&y<matrix[0].size()&&matrix[x][y]>=matrix[r][c])dfs(matrix,can,x,y);
        }
    }
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {
        if(matrix.empty())return {};  //錯誤1 邊界判斷以及怎麼邊界判斷
        vector<vector<int>> result;
        int n=matrix.size();int m=matrix[0].size();
        vector<vector<bool>> Pcan(n,vector<bool>(m,false));
        vector<vector<bool>> Acan(n,vector<bool>(m,false));
        for(int i=0;i<n;i++){
            dfs(matrix,Pcan,i,0);
            dfs(matrix,Acan,i,m-1);

        }for(int i=0;i<m;i++){
            dfs(matrix,Pcan,0,i);
            dfs(matrix,Acan,n-1,i);
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(Pcan[i][j]&&Acan[i][j])
                    result.push_back({i,j});
        return result;
    }
  • 錯誤
    • 要注意邊界判斷,以及怎麼返回一個空的二維陣列

三、總結

思想不會的題目,比較困難。

相關文章