Leetcode笔记目录
一、题目描述
给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。
规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。
请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。
二、解题过程
1.思想
思想比较难想到,如果遍历每个点代价会很大,但如果从周围的大洋四个边逆推dfs则可以完成目标:
- 题目要求能流到大西洋和太平洋,因此设置两个visited数组,只有满足条件后才visit;
- 分别遍历四条边,并以四条边上的每个点做起点进行dfs,根据依靠大洋的不同更新相应的visited数组;
- 两个visited数组都true的点是符合条件的点;
- 参考Leetcode 695的dfs递归有两种写法,此题只能采用先判断后搜索的方式,因为需要与上次搜索的海拔相比较,而先搜索后判断是无法获得上次搜索的数据的。
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;
}
- 错误
- 要注意边界判断,以及怎么返回一个空的二维数组;
三、总结
思想不会的题目,比较困难。