题目地址:
https://leetcode-cn.com/probl…
题目描述:
给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。
规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。
请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。
解答:
反向思维,某个地方可以流向大西洋或太平洋,我们把它理解为太平洋或者大西洋可以流向某个区域,这样一来只需要从大西洋或者太平样的节点进行深度优先搜索即可。只不过原来的流动条件是高往低流,现在变为低往高流。
java ac代码:
class Solution {
boolean[][]left;
boolean[][]right;
boolean[][] flag1;
boolean[][] flag2;
public List<int[]> pacificAtlantic(int[][] matrix) {
List<int[]> ans = new ArrayList(1000);
if(matrix.length == 0)return ans;
left = new boolean[matrix.length][matrix[0].length];
right = new boolean[matrix.length][matrix[0].length];
flag1 = new boolean[matrix.length][matrix[0].length];
flag2 = new boolean[matrix.length][matrix[0].length];
for(int i = 0;i < matrix.length;i++)
{
dfsleft(matrix,flag1,i,0);
dfsright(matrix,flag2,i,matrix[0].length-1);
}
for(int i = 0;i < matrix[0].length;i++)
{
dfsleft(matrix,flag1,0,i);
dfsright(matrix,flag2,matrix.length-1,i);
}
for(int i = 0;i < matrix.length;i++)
for(int j = 0;j < matrix[0].length;j++)
if(left[i][j] && right[i][j])
ans.add(new int[]{i,j});
return ans;
}
void dfsleft(int[][] matrix,boolean[][]flag,int x,int y)
{
if(flag[x][y])return;
flag[x][y] = true;
left[x][y] = true;
if((x-1 >= 0 && x-1 < matrix.length && y >= 0 && y< matrix[0].length) && matrix[x-1][y] >= matrix[x][y])
dfsleft(matrix,flag,x-1,y);
if((x+1 >= 0 && x+1 < matrix.length && y >= 0 && y< matrix[0].length) && matrix[x+1][y] >= matrix[x][y])
dfsleft(matrix,flag,x+1,y);
if((x >= 0 && x < matrix.length && y-1 >= 0 && y-1< matrix[0].length) && matrix[x][y-1] >= matrix[x][y])
dfsleft(matrix,flag,x,y-1);
if((x >= 0 && x < matrix.length && y+1 >= 0 && y+1< matrix[0].length) && matrix[x][y+1] >= matrix[x][y])
dfsleft(matrix,flag,x,y+1);
}
void dfsright(int[][] matrix,boolean[][]flag,int x,int y)
{
if(flag[x][y])return;
flag[x][y] = true;
right[x][y] = true;
if((x-1 >= 0 && x-1 < matrix.length && y >= 0 && y< matrix[0].length) && matrix[x-1][y] >= matrix[x][y])
dfsright(matrix,flag,x-1,y);
if((x+1 >= 0 && x+1 < matrix.length && y >= 0 && y< matrix[0].length) && matrix[x+1][y] >= matrix[x][y])
dfsright(matrix,flag,x+1,y);
if((x >= 0 && x < matrix.length && y-1 >= 0 && y-1< matrix[0].length) && matrix[x][y-1] >= matrix[x][y])
dfsright(matrix,flag,x,y-1);
if((x >= 0 && x < matrix.length && y+1 >= 0 && y+1< matrix[0].length) && matrix[x][y+1] >= matrix[x][y])
dfsright(matrix,flag,x,y+1);
}
}