LeetCode:417.太平洋大西洋水流问题
LeetCode:417.太平洋大西洋水流问题

解题思路把矩阵想象成图。从海岸线逆流而上遍历图,所到之处就是可以流到某个大洋的坐标。
解题步骤新建两个矩阵,分别记录能流到两个大洋的坐标。从海岸线,多管齐下,同时深度优先遍历图,过程中填充上述矩阵。遍历两个矩阵,找出能流到两个大洋的坐标。
有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。 岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。 返回网格坐标 result 的 2D 列表 ,其中 result[i] = [ri, ci] 表示雨水从单元格 (ri, ci) 流动 既可流向太平洋也可流向大西洋 。
输入: heights = [[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]] 示例 2: 输入: heights = [[2,1],[1,2]] 输出: [[0,0],[0,1],[1,0],[1,1]]
0
1 m
n
0
1 n
m
0n
1m m
n
0m
1n m
n
//96ms 60.60mb
//81ms 60.59mb
//79ms 60.65mb
//57ms 60.65mb
//1stack bool null int +
/**
* @param {number[][]} heights
* @return {number[][]}
*/
var pacificAtlantic = function(heights) {
let m=heights.length,n=heights[0].length; // 获取矩阵的行数和列数
let has=true
let disHas=null
let flow1=Array.from({length:m},()=>new Array(n).fill(disHas)); // 太平洋水流标记矩阵
let flow2=Array.from({length:m},()=>new Array(n).fill(disHas));
let result=[];
var dfs=(x,y,flow)=>{
flow[x][y]=has; // 标记当前位置已经访问
// 遍历四个方向||左||右||上||下
[[x-1,y],[x+1,y],[x,y+1],[x,y-1]].forEach(([dx,dy])=>{
if(
// 保证在矩阵中
dx>=0&&dy>=0&&
dx<m&&dy<n&&
// 防止死循环
!flow[dx][dy]&&
// 保证水流方向是逆流
heights[dx][dy]>=heights[x][y]
){
dfs(dx,dy,flow); // 递归访问四个方向
}
})
}
// 遍历第一列和最后一列 //沿着海岸线逆流而上
for(let i=0;i<m;i++){
dfs(i,0,flow1); // 太平洋水流
dfs(i,n-1,flow2); // 大西洋水流
}
// 遍历第一行和最后一行
for(let i=0;i<n;i++){
dfs(0,i,flow1);
dfs(m-1,i,flow2);
}
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
if(flow1[i][j]&&flow2[i][j]){
result.push([i,j]);
}
}
}
return result;
};
//39ms 60.48mb O(M*N)
'

浙公网安备 33010602011771号