当前位置: 首页 > news >正文

代码随想录Day42-图论:力扣第417m、841m、463e题

417m. 太平洋大西洋水流问题

题目链接
代码随想录文章讲解链接

方法一:

用时:1h0m58s

思路

直接找哪些点既可以到达太平洋又可以到达大西洋比较麻烦,换个角度,找到太平洋可以逆流而上到达的点,再找到大西洋可以逆流而上到达的点,两者的交集就是所需要的答案。
用两个二维数组分别记录太平洋和大西洋可以逆流而上达到的点,对边界的点使用DFS。

  • 时间复杂度: O ( m ⋅ n ) O(m \cdot n) O(mn)
  • 空间复杂度: O ( m ⋅ n ) O(m \cdot n) O(mn)
C++代码
class Solution {
private:int m;int n;void dfs(vector<vector<int>>& heights, vector<vector<bool>>& visited, int x, int y) {visited[x][y] = true;if (x - 1 >= 0 && !visited[x - 1][y] && heights[x - 1][y] >= heights[x][y]) dfs(heights, visited, x - 1, y);if (x + 1 < m && !visited[x + 1][y] && heights[x + 1][y] >= heights[x][y]) dfs(heights, visited, x + 1, y);if (y - 1 >= 0 && !visited[x][y - 1] && heights[x][y - 1] >= heights[x][y]) dfs(heights, visited, x, y - 1);if (y + 1 < n && !visited[x][y + 1] && heights[x][y + 1] >= heights[x][y]) dfs(heights, visited, x, y + 1);}public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {m = heights.size();n = heights[0].size();vector<vector<bool>> pacific(m, vector<bool>(n, false));vector<vector<bool>> atlantic(m, vector<bool>(n, false));vector<vector<int>> res;for (int i = 0; i < m; ++i) {if (!pacific[i][0]) dfs(heights, pacific, i, 0);if (!atlantic[i][n - 1]) dfs(heights, atlantic, i, n - 1);}for (int i = 0; i < n; ++i) {if (!pacific[0][i]) dfs(heights, pacific, 0, i);if (!atlantic[m - 1][i]) dfs(heights, atlantic, m - 1, i);}for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (pacific[i][j] && atlantic[i][j]) res.push_back({i, j});}}return res;}
};

方法二:BFS

用时:6m53s

思路
  • 时间复杂度: O ( m n ) O(mn) O(mn)
  • 空间复杂度: O ( m n ) O(mn) O(mn)
C++代码
class Solution {
private:int m;int n;int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};void bfs(vector<vector<int>>& heights, vector<vector<bool>>& visited, int x, int y) {queue<pair<int, int>> que;que.push(pair<int, int>(x, y));visited[x][y] = true;while (!que.empty()) {pair<int, int> tmp = que.front();que.pop();for (int i = 0; i < 4; ++i) {int nextx = tmp.first + dir[i][0];int nexty = tmp.second + dir[i][1];if (!(nextx < 0 || nextx >= m || nexty < 0 || nexty >= n) && !visited[nextx][nexty] && heights[nextx][nexty] >= heights[tmp.first][tmp.second]) {visited[nextx][nexty] = true;que.push(pair<int, int>(nextx, nexty));}}}}public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {m = heights.size();n = heights[0].size();vector<vector<bool>> pacific(m, vector<bool>(n, false));vector<vector<bool>> atlantic(m, vector<bool>(n, false));vector<vector<int>> res;for (int i = 0; i < m; ++i) {if (!pacific[i][0]) bfs(heights, pacific, i, 0);if (!atlantic[i][n - 1]) bfs(heights, atlantic, i, n - 1);}for (int i = 0; i < n; ++i) {if (!pacific[0][i]) bfs(heights, pacific, 0, i);if (!atlantic[m - 1][i]) bfs(heights, atlantic, m - 1, i);}for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (pacific[i][j] && atlantic[i][j]) res.push_back({i, j});}}return res;}
};

看完讲解的思考

逆流而上,真妙啊。

代码实现遇到的问题

无。


841m. 钥匙和房间

题目链接
代码随想录文章讲解链接

方法一:DFS

用时:12m21s

思路

DFS一遍,若有房间没走过则返回false。

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
C++代码
class Solution {
private:void dfs(vector<vector<int>>& rooms, vector<bool>& visited, int i) {visited[i] = true;for (int j = 0; j < rooms[i].size(); ++j) {if (!visited[rooms[i][j]]) dfs(rooms, visited, rooms[i][j]);}}public:bool canVisitAllRooms(vector<vector<int>>& rooms) {vector<bool> visited(rooms.size(), false);dfs(rooms, visited, 0);for (int i = 0; i < rooms.size(); ++i) {if (!visited[i]) return false;}return true;}
};

方法二:BFS

用时:4m46s

思路
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
C++代码
class Solution {
public:bool canVisitAllRooms(vector<vector<int>>& rooms) {vector<bool> visited(rooms.size(), false);queue<int> que;visited[0] = true;que.push(0);while (!que.empty()) {int curRoom = que.front();que.pop();for (int i = 0; i < rooms[curRoom].size(); ++i) {if (!visited[rooms[curRoom][i]]) {visited[rooms[curRoom][i]] = true;que.push(rooms[curRoom][i]);}}}for (int i = 1; i < rooms.size(); ++i) {if (!visited[i]) return false;}return true;}
};

看完讲解的思考

无。

代码实现遇到的问题

无。


463e. 岛屿的周长

题目链接
代码随想录文章讲解链接

方法一:DFS

用时:7m37s

思路

在DFS的过程中,某个方向到达边界或者到达水域,则说明该方向是一条边,周长+1。

  • 时间复杂度: O ( m n ) O(mn) O(mn)
  • 空间复杂度: O ( m n ) O(mn) O(mn)
C++代码
class Solution {
private:int m;int n;int perimeter;void dfs(vector<vector<int>>& grid, int x, int y) {grid[x][y] = 2;if (x - 1 < 0 || grid[x - 1][y] == 0) ++perimeter;else if (grid[x - 1][y] != 2) dfs(grid, x - 1, y);if (x + 1 >= m || grid[x + 1][y] == 0) ++perimeter;else if (grid[x + 1][y] != 2) dfs(grid, x + 1, y);if (y - 1 < 0 || grid[x][y - 1] == 0) ++perimeter;else if (grid[x][y - 1] != 2) dfs(grid, x, y - 1);if (y + 1 >= n || grid[x][y + 1] == 0) ++perimeter;else if (grid[x][y + 1] != 2) dfs(grid, x, y + 1);}public:int islandPerimeter(vector<vector<int>>& grid) {m = grid.size();n = grid[0].size();for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] == 1) {dfs(grid, i, j);return perimeter;}}}return perimeter;}
};

方法二:BFS

用时:4m55s

思路
  • 时间复杂度: O ( m n ) O(mn) O(mn)
  • 空间复杂度: O ( m n ) O(mn) O(mn)
C++代码
class Solution {
private:int m;int n;int perimeter;int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};void bfs(vector<vector<int>>& grid, int x, int y) {queue<pair<int, int>> que;grid[x][y] = 2;que.push(pair<int, int>(x, y));while (!que.empty()) {pair<int, int> tmp = que.front();que.pop();for (int i = 0; i < 4; ++i) {int nextx = tmp.first + dir[i][0];int nexty = tmp.second + dir[i][1];if (nextx < 0 || nextx >= m || nexty < 0 || nexty >= n || grid[nextx][nexty] == 0) ++perimeter;else if (grid[nextx][nexty] != 2) {grid[nextx][nexty] = 2;que.push(pair<int, int>(nextx, nexty));}}}}public:int islandPerimeter(vector<vector<int>>& grid) {m = grid.size();n = grid[0].size();for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] == 1) {bfs(grid, i, j);return perimeter;}}}return perimeter;}
};

方法三:遍历

用时:7m11s

思路

其实直接遍历就行了,遇到陆地就判断一下四条边,根本不用dfs、bfs这么复杂…

  • 时间复杂度: O ( m n ) O(mn) O(mn)
  • 空间复杂度: O ( 1 ) O(1) O(1)
C++代码
class Solution {
public:int islandPerimeter(vector<vector<int>>& grid) {int m = grid.size();int n = grid[0].size();int perimeter = 0;for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] == 1) {if (i - 1 < 0 || grid[i - 1][j] == 0) ++perimeter;if (i + 1 >= m || grid[i + 1][j] == 0) ++perimeter;if (j - 1 < 0 || grid[i][j - 1] == 0) ++perimeter;if (j + 1 >= n || grid[i][j + 1] == 0) ++perimeter;}}}return perimeter;}
};

看完讲解的思考

无。

代码实现遇到的问题

无。


最后的碎碎念

一刷倒数第二天!

相关文章:

  • 【网络协议】聊聊DNS协议如何域名解析和负载均衡
  • 中期科技:智慧公厕打造智能化城市设施,提升公共厕所管理与服务体验
  • Mybatis技术原理详解之:使用Mapper形式和注解驱动的复杂映射开发
  • 数据结构(超详细讲解!!)第二十一节 特殊矩阵的压缩存储
  • 【lvgl】linux开发板搭建环境
  • 类和对象解析
  • Java21-虚拟线程小试牛刀-meethigher
  • Python---字符串中的查找方法--index()--括号里是要获取的字符串
  • Qt5 安装 phonon
  • 力扣:150. 逆波兰表达式求值(Python3)
  • 数据结构和算法的区分和学习
  • Flask蓝图(Blueprint)
  • Pycharm 对容器中的 Python 程序断点远程调试
  • visual basic 6.0软件安装包(永久),适用于Windows各系统附安装教程
  • 旅游业为什么要选择VR全景,VR全景在景区旅游上有哪些应用
  • Android Studio:GIT提交项目到远程仓库
  • JS变量作用域
  • learning koa2.x
  • Material Design
  • React Transition Group -- Transition 组件
  • React系列之 Redux 架构模式
  • SQLServer之索引简介
  • vue 配置sass、scss全局变量
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分享一份非常强势的Android面试题
  • 普通函数和构造函数的区别
  • 前端攻城师
  • 一个完整Java Web项目背后的密码
  • 一个项目push到多个远程Git仓库
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • UI设计初学者应该如何入门?
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​Java并发新构件之Exchanger
  • ​低代码平台的核心价值与优势
  • #DBA杂记1
  • #Lua:Lua调用C++生成的DLL库
  • #Z0458. 树的中心2
  • (floyd+补集) poj 3275
  • (HAL库版)freeRTOS移植STMF103
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (已解决)什么是vue导航守卫
  • .bat批处理(六):替换字符串中匹配的子串
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Net CF下精确的计时器
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET程序员迈向卓越的必由之路
  • .NET企业级应用架构设计系列之技术选型
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET学习教程二——.net基础定义+VS常用设置
  • /proc/interrupts 和 /proc/stat 查看中断的情况