LeetCode 417. 太平洋大西洋水流问题(BFS/DFS)

1. 题目

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pacific-atlantic-water-flow
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 逆向考虑,从两个大洋,往高处或等高的地方流
  • 留到2次的地方为答案

2.1 BFS 广度优先搜索

class Solution {
	vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {
        if(matrix.empty() || matrix[0].empty())
            return {};
		int m = matrix.size(), n = matrix[0].size(), i, j, x, y, k, v;
		vector<vector<bool>> visited(m, vector<bool>(n,false));
		queue<vector<int>> q;
		for(i = 0; i < n; ++i)//加入太平洋的两条边
		{
			q.push({0,i});
			visited[0][i] = true;
		}
		for(i = 1; i < m; ++i)//加入太平洋的两条边
		{
			q.push({i,0});
			visited[i][0] = true;
		}
		while(!q.empty())
		{
			x = q.front()[0];
			y = q.front()[1];
			v = matrix[x][y];
			q.pop();
			for(k = 0; k < 4; ++k)
			{
				i = x + dir[k][0];
				j = y + dir[k][1];
				if(i>=0 && i<m && j>=0 && j<n && !visited[i][j] && v <= matrix[i][j])
				{
					q.push({i,j});
					visited[i][j] = true;
				}
			}
		}
		vector<vector<bool>> visited2(m, vector<bool>(n,false));
		for(i = 0; i < n; ++i)//加入大西洋的两条边
		{
			q.push({m-1,i});
			visited2[m-1][i] = true;
		}
		for(i = 0; i < m-1; ++i)//加入大西洋的两条边
		{
			q.push({i,n-1});
			visited2[i][n-1] = true;
		}
		while(!q.empty())
		{
			x = q.front()[0];
			y = q.front()[1];
			v = matrix[x][y];
			q.pop();
			for(k = 0; k < 4; ++k)
			{
				i = x + dir[k][0];
				j = y + dir[k][1];
				if(i>=0 && i<m && j>=0 && j<n && !visited2[i][j] && v <= matrix[i][j])
				{
					q.push({i,j});
					visited2[i][j] = true;
				}
			}
		}
		vector<vector<int>> ans;
		for(i = 0; i < m; ++i)
		{
			for(j = 0; j < n; ++j)
			{
				if(visited[i][j] && visited2[i][j])//访问过两次的
					ans.push_back({i,j});
			}
		}
		return ans;
    }
};

112 ms 18.7 MB

2.2 DFS 深度优先搜索

class Solution {
	vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};
    int m, n;
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {
        if(matrix.empty() || matrix[0].empty())
            return {};
		m = matrix.size(), n = matrix[0].size();
        int i, j;
		vector<vector<bool>> visited(m, vector<bool>(n,false));
		for(i = 0; i < n; ++i)
		{
            if(!visited[0][i])
			{
                visited[0][i] = true;
                dfs(0,i,visited,matrix);
            }
		}
		for(i = 1; i < m; ++i)
		{
			if(!visited[i][0])
			{
                visited[i][0] = true;
                dfs(i,0,visited,matrix);
            }
		}
        vector<vector<bool>> visited2(m, vector<bool>(n,false));
        for(i = 0; i < n; ++i)
		{
			if(!visited2[m-1][i])
			{
                visited2[m-1][i] = true;
                dfs(m-1,i,visited2,matrix);
            }
		}
		for(i = 0; i < m-1; ++i)
		{
			if(!visited2[i][n-1])
			{
                visited2[i][n-1] = true;
                dfs(i,n-1,visited2,matrix);
            }
		}
        vector<vector<int>> ans;
		for(i = 0; i < m; ++i)
		{
			for(j = 0; j < n; ++j)
			{
				if(visited[i][j] && visited2[i][j])
					ans.push_back({i,j});
			}
		}
		return ans;
    }
    void dfs(int x, int y, vector<vector<bool>>& visited,vector<vector<int>>& matrix)
    {
        int i, j, v = matrix[x][y];
        for(int k = 0; k < 4; ++k)
        {
            i = x + dir[k][0];
            j = y + dir[k][1];
            if(i>=0 && i<m && j>=0 && j<n && !visited[i][j] && v <= matrix[i][j])
            {
                visited[i][j] = true;
                dfs(i, j, visited, matrix);
            }
        }	
    }
};

100 ms 15.4 MB

猜你喜欢

转载自blog.csdn.net/qq_21201267/article/details/106208344