【学习打卡】第20天 数据结构和算法
2022/8/26 4:22:55
本文主要是介绍【学习打卡】第20天 数据结构和算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
图
太平洋大西洋水流问题(leetcode - 417)
有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。
这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。
岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。
返回网格坐标 result 的 2D 列表 ,其中 result[i] = [ri, ci] 表示雨水从单元格 (ri, ci) 流动 既可流向太平洋也可流向大西洋 。
思路
- 把矩阵想象成图
- 从海岸线逆流而上遍历图,所到之处就是可以流到某个大洋的坐标。
步骤
- 新建两个矩阵,分别记录能流到两个大洋的坐标
- 从海岸线出发,同时深度优先遍历图,过程中填充上述矩阵
- 遍历两个矩阵,找出能流到两个大洋的坐标
/** * @param {number[][]} heights * @return {number[][]} */ var pacificAtlantic = function(heights) { if(!heights || !heights[0]) { return [] } const m = heights.length const n = heights[0].length const flow1 = Array.from({length: m}, () => new Array(n).fill(false)) const flow2 = Array.from({length: m}, () => new Array(n).fill(false)) const dfs = (r, c, flow) => { flow[r][c] = true; [[r-1, c], [r+1, c], [r, c-1], [r, c+1]].forEach(([nr, nc]) => { if(nr >= 0 && nr < m && nc >= 0 && nc < n && !flow[nr][nc] && heights[nr][nc] >= heights[r][c]){ dfs(nr, nc, flow) } }) } for(let r = 0; r < m; r++) { dfs(r, 0, flow1) dfs(r, n-1, flow2) } for(let c = 0; c < n; c++) { dfs(0, c, flow1) dfs(m-1, c, flow2) } const res = []; for(let r = 0; r < m; r++) { for(let c = 0; c < n; c++) { if(flow1[r][c] && flow2[r][c]){ res.push([r, c]) } } } return res };
这篇关于【学习打卡】第20天 数据结构和算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-24Java中定时任务实现方式及源码剖析
- 2024-11-24Java中定时任务实现方式及源码剖析
- 2024-11-24鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
- 2024-11-24细说敏捷:敏捷四会之每日站会
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解