• 太平洋大西洋水流问题


    给定一个 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]] (上图中带括号的单元).

    code:从中间向四周遍历。遍历每个元素判断其是否能同时到达太平洋和大西洋。超时

    class Solution {
    private:
        bool inPacific;
        bool inAtlantic;
        vector<vector<bool>> visited;
        vector<int> nextX{1,-1,0,0};
        vector<int> nextY{0,0,1,-1};
    private:
        void pacificAtlanticCore(const vector<vector<int>>& matrix,int x,int y)
        {
            if(x<0||y<0)
            {
                inPacific=true;
                return ;
            }
            if(x>=matrix.size()||y>=matrix[0].size())
            {
                inAtlantic=true;
                return ;
            }
    
            //visited[x][y]=true;
            for(int i=0;i<4;++i)
            {
                int newX=x+nextX[i];
                int newY=y+nextY[i];
                if(newX<0||newX>=matrix.size()||newY<0||newY>=matrix[0].size())
                    pacificAtlanticCore(matrix,newX,newY);
                else if(!visited[newX][newY]&&matrix[x][y]>=matrix[newX][newY])
                {
                    visited[newX][newY]=true;
                    pacificAtlanticCore(matrix,newX,newY);
                }
            }
            //visited[x][y]=false;
        }
    public:
        vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {
            if(matrix.empty()||matrix[0].empty())
                return {};
    
            vector<vector<int>> res;
            vector<bool> tmp(matrix[0].size(),false);
            for(int i=0;i<matrix.size();++i)
            {
                for(int j=0;j<matrix[0].size();++j)
                {
                    visited.clear();
                    visited.resize(matrix.size(),tmp);
                    inAtlantic=false;
                    inPacific=false;
                    pacificAtlanticCore(matrix,i,j);
                    if(inPacific&&inAtlantic)
                        res.push_back({i,j});
                }
            }
            return res;
        }
    };

     code1:从四周向中间遍历

    class Solution {
        void dfs(const vector<vector<int>>& matrix,int x,int y,vector<vector<bool>>& visited)
        {
            if(x<0||x>=matrix.size()||y<0||y>=matrix[0].size()||visited[x][y])
                return ;
            
            visited[x][y]=true;
            if(x>0&&matrix[x][y]<=matrix[x-1][y])
                dfs(matrix,x-1,y,visited);
            if(x<matrix.size()-1&&matrix[x][y]<=matrix[x+1][y])
                dfs(matrix,x+1,y,visited);
            if(y<matrix[0].size()-1&&matrix[x][y]<=matrix[x][y+1])
                dfs(matrix,x,y+1,visited);
            if(y>0&&matrix[x][y]<=matrix[x][y-1])
                dfs(matrix,x,y-1,visited);
        }
    public:
        vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {
            if(matrix.empty()||matrix[0].empty())
                return {};
    
            int row=matrix.size();
            int col=matrix[0].size();
            vector<vector<bool>> pacific(row,vector<bool>(col,false));
            vector<vector<bool>> atlantic(row,vector<bool>(col,false));
    
            for(int i=0;i<row;++i)
            {
                dfs(matrix,i,0,pacific);
                dfs(matrix,i,col-1,atlantic);
            }
            for(int j=0;j<col;++j)
            {
                dfs(matrix,0,j,pacific);
                dfs(matrix,row-1,j,atlantic);
            }
    
            vector<vector<int>> res;
            for(int i=0;i<row;++i)
            {
                for(int j=0;j<col;++j)
                {
                    if(pacific[i][j]&&atlantic[i][j])
                        res.push_back({i,j});
                }
            }
            return res;
        }
    };
  • 相关阅读:
    Objective-C 排序
    Objective-C 工厂方法
    Objective-C 关键字:retain, assgin, copy, readonly,atomic,nonatomic
    iOS UINavigationController的使用
    iOS UITabBarController的使用
    iOS UISearchController的使用
    iOS中延时执行的几种方式的比较和汇总
    iOS适配 旧项目工程在iOS9下不能正常显示
    iOS Block界面反向传值
    iOS Block简介
  • 原文地址:https://www.cnblogs.com/tianzeng/p/12559638.html
Copyright © 2020-2023  润新知