题目描述
思路
参考自:https://leetcode-cn.com/problems/pacific-atlantic-water-flow/solution/417java-dfscong-bian-yuan-wang-li-fang-wen-xiang-j/
要同时满足可以到达太平洋和大西洋,所以一个点需要进行两次路径的行走,一次以太平洋为目标,一次以大西洋为目标。从内部的点以边界为目标去进行路径行走比较麻烦,所以可以换个思路:从边界往里面走。 类似130题逆向解法。
需要修改通行规则:
- 要往高度比当前点高的或者相等的点走
算法步骤
递归函数 dfs(int r, int c, boolean[ ][ ] canReach),第三个参数代表大西洋/太平洋相邻的点可以访问到的点,这些点也就是可以流到相应大洋的点。
* 首先标记当前点
* 然后对上下左右四个方向进行遍历,在矩阵范围内并且高度比当前点高或者相等并且还没有访问过,就可以继续dfs访问
主函数 中:
1. 先初始化变量,
2. 然后生成大西洋/太平洋的访问状态 boolean[ ][ ] canReachP/canReachA = new boolean[m][n];
3. 然后对矩阵的上下左右四条边界的点分别调用dfs(),进行从大西洋/太平洋到内部的访问。
最后对二维平面的所有点进行遍历,找到 canReachP[i][j] && canReachA[i][j] 的点,就是可以同时达到两个大洋的点。
时间复杂度: O(n),最多只对每个点进行了三次遍历,n 是坐标点的个数
空间复杂度: 除去递归调用占用的空间为O(n)
代码
一些问题
- boolean[ ]数组默认值为false
- this.matrix = matrix;
- Arrays.asList()方法将一个数组转换为List集合,具体可以参考:https://blog.csdn.net/kzadmxz/article/details/80394351