leetcode 417 太平洋大西洋水流问题
一、题目描述
二、解题思路
整体思路
(1)可以使用深度优先搜索的方法来解决这个问题;
(2)正难则反,若遍历heights数组判断每个位置是否能够流向“太平洋”和“大西洋”,难度很大。可以反着来思考,处理边界:
<1>上边界和左边界为起点寻找递增的位置(即为可以流向太平洋的位置),将对应的Pacific值修改为true;
<2>下边界和右边界为起点寻找递增的位置(即为可以流向大西洋的位置),将对应的Atlantic值修改为true;
边界处理完后,遍历heights数组,如果某位置对应的Pacific值和Atlantic值均为true,则代表该位置即可以通向太平洋又可以通向大西洋,即为我们需要的位置;
具体思路
(1)函数功能:dfs函数用于将以(i,j)为起点的递增的位置,即可以达到该边界的所有位置全部染色(对应的visited值修改为true)。
(2)函数体:
<1>首先,将visited[i][j]修改为true;
<2>按照上、右、下、左的顺序,如果(x,y)不越界,且visited[x][y]为false且heights[i][j]<=heights[x][y],则对(x,y)位置递归调用dfs函数。
三、代码实现
class Solution {int m,n;
public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {//初始化全局变量m=heights.size();n=heights[0].size();vector<vector<bool>> Pacific(m,vector<bool>(n,false));vector<vector<bool>> Atlantic(m,vector<bool>(n,false));vector<vector<int>> ret;for(int i=0;i!=m;i++)for(int j=0;j!=n;j++){if(i==0||j==0)dfs(heights,i,j,Pacific);if(i==m-1||j==n-1)dfs(heights,i,j,Atlantic);}for(int i=0;i!=m;i++)for(int j=0;j!=n;j++){if(Pacific[i][j]&&Atlantic[i][j])ret.push_back({i,j});}return ret;}int dx[4]={0,1,0,-1};int dy[4]={1,0,-1,0};void dfs(vector<vector<int>>& heights,int i,int j,vector<vector<bool>>& visited){visited[i][j] = true;for(int k=0;k!=4;k++){int x=i+dx[k];int y=j+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&!visited[x][y]&&heights[i][j]<=heights[x][y])dfs(heights,x,y,visited);}}
};