Shu-How Zの小窝

Loading...

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

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

img

解题思路把矩阵想象成图。从海岸线逆流而上遍历图,所到之处就是可以流到某个大洋的坐标。

解题步骤新建两个矩阵,分别记录能流到两个大洋的坐标。从海岸线,多管齐下,同时深度优先遍历图,过程中填充上述矩阵。遍历两个矩阵,找出能流到两个大洋的坐标。

有一个 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)

'

posted @ 2025-01-13 17:04  KooTeam  阅读(9)  评论(0)    收藏  举报