代码随想录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;}
};

看完讲解的思考

无。

代码实现遇到的问题

无。


最后的碎碎念

一刷倒数第二天!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BigDecimal 类型的累加操作

BigDecimal 累加操作 .add操作

C语言:深入浅出qsort方法,编写自己的qsort完成冒泡排序

目录 什么是qsort&#xff1f; 函数原型 比较函数 compar 排序整型数组 排序结构体数组 根据成员字符排序 strcmp函数 根据成员整型排序 自定义qsort实现冒泡排序 qsort的实现原理 具体步骤 快速排序示例代码&#xff1a; 什么是qsort&#xff1f; qsort是 C …

geoserver发布同一字段的多值渲染

Geoserver之同一字段的多值渲染 有时候我们需要对一个shp的某一字段值中的不同值进行区分展示&#xff0c;但是一般的渲染都是按照统一图层展示的&#xff0c;因此为了更好的效果&#xff0c;我们选择使用uDig等工具处理。 文章目录 Geoserver之同一字段的多值渲染前言一共是分…

休眠和睡眠有哪些区别?如何让电脑一键休眠?

电脑中有休眠和睡眠&#xff0c;那么它们有什么区别呢&#xff1f;下面我们就通过本文来了解一下。 休眠和睡眠的区别 电脑在睡眠状态时&#xff0c;会切断内存之外的设备电源&#xff0c;电脑会进入睡眠状态&#xff0c;当再次唤醒电脑后&#xff0c;不会影响睡眠前保存好的工…

机器学习练习1

线性回归 数据集模型,第一列代表人口,第二列代表利润 此处的线性回归 与 常规的 y wx b 不同的是 将b换成了w的一部分 故需要在数据集x前面加个1, 求出b . 可以简化计算,只需要一个乘法就可以

网络安全入门必学内容

网络安全入门 必/学/内/容/ 随着时代的发展&#xff0c;经济、社会、生产、生活越来越依赖网络。而随着万物互联的物联网技术的兴起&#xff0c;线上线下已经打通&#xff0c;虚拟世界和现实世界的边界正变得模糊。这使得来自网络空间的攻击能够穿透虚拟世界的边界&#xff0…

vscode中 vue3+ts 项目的提示失效,volar插件失效问题解决方案

文章目录 前情提要bug回顾解决方案最后 前情提要 说起来很耻辱&#xff0c;从mac环境换到window环境&#xff0c;vscode的配置都是云端更新过来的&#xff0c;应该是一切正常才对&#xff0c;奇怪的是我的项目环境出现问题了&#xff0c;关于组件的ts和追踪都没有效果&#xff…

pandas教程:Introduction to pandas Data Structures pandas的数据结构

文章目录 Chapter 5 Getting Started with pandas5.1 Introduction to pandas Data Structures1 Series2 DataFrame3 Index Objects (索引对象) Chapter 5 Getting Started with pandas 这样导入pandas&#xff1a; import pandas as pde:\python3.7\lib\site-packages\numpy…

vscode设置pycharm中的项目路径和debug方法

真大佬在这 真大佬在这 必须给大佬star 命令行运行&#xff1a; export PYTHONPATH:pwd:/home/bennie/bennie/bennie_project/AI_Lab python main.py 当关闭此命令行时&#xff0c;临时路径会清除&#xff0c;可以将上述export的整条语句&#xff0c;加入~/.bashrc中 该命令中…

uniapp cli化一键游项目启动报错总结

问题1、使用hbuilder运行指令&#xff0c;开始编译后没有反应&#xff0c;使用命令构建自行结束进程 解决&#xff1a;因为使用了node16.24&#xff0c;卸载重新安装14.17后解决 问题2、 21:31:11.483 Module build failed (from ./node_modules/vue/cli-service/node_module…

一、分页嵌套查询

情况说明,简化 现在要查询A表和B表的数据&#xff0c;A和B的关系是一对多&#xff0c;B中有A.ID 例&#xff1a; A&#xff08;ID,NAME,TYPE,CREATE_TIME&#xff09; B&#xff08;ID,A_ID,ONE,TWO&#xff09; 要求根据B.TWO为条件&#xff0c;模糊查询所有满足条件的数据 //…

从零开始搭建React+TypeScript+webpack开发环境-自定义配置化的模拟服务器

技术栈 我们将使用Node.js和Express.js作为我们的后端框架&#xff0c;以及Node.js的文件系统(fs)模块来操作文件和文件夹。此外&#xff0c;我们将使用Node.js的require和delete require.cache来加载和更新模拟数据。 项目结构 首先&#xff0c;让我们定义一个简单的项目结…

Modbus封装库(Com,tcp,udp一应俱全)

自行封装在用的Modbus通迅库,集成了com,tcp,udp, 做个笔记吧&#xff0c; 以下头文件&#xff0c; #pragma once #include <functional> #include <vector> #include <string> #include <memory> #ifdef LIBMODBUS_EXPORTS #define LIBMODBUS_EXPORT_…

重磅发布 OpenAI 推出用户自定义版 ChatGPT

文章目录 重磅发布 OpenAI 推出用户自定义版 ChatGPT个人简介 重磅发布 OpenAI 推出用户自定义版 ChatGPT OpenAI 首届开发者大会 (OpenAI DevDay) 于北京时间 11 月 7 日凌晨 02:00 开始&#xff0c;大会上宣布了一系列平台更新。其中一个重要更新是用户可以创建他们自己的自定…

从零开始的C++(十四)

继承&#xff1a; 作用&#xff1a;减少重复代码&#xff0c;简化程序。 用法&#xff1a; class b&#xff1a;public a {//...b中成员 } 在如上代码中&#xff0c;b类以public的方式继承了a类。规定a类是父类、基类&#xff0c;b类是子类、派生类。 关于继承方式&#xf…

Qt::WindowFlags

Qt::WindowFlags 文章目录 Qt::WindowFlags摘要窗口&部件Qt::WindowFlags&WindowType窗口类型窗口提示 关键字&#xff1a; Qt、 Qt::WindowFlags、 Qt::WindowType、 关键字4、 关键字5 摘要 今天在公司解决自己的Bugs的时候&#xff0c;发现一个以前可以用的功…

在Kotlin中设置User-Agent以模拟搜索引擎爬虫

前言 随着双十一电商活动的临近&#xff0c;电商平台成为了狂欢的中心。对于商家和消费者来说&#xff0c;了解市场趋势和竞争对手的信息至关重要。在这个数字时代&#xff0c;爬虫技术成为了获取电商数据的有力工具之一。本文将以亚马逊为例&#xff0c;介绍如何使用Kotlin编…

软件测试面试题【2023最新合集】

收集了各大公司的面试经验&#xff0c;现整理出来&#xff0c;希望能给正在找工作的志同道合的小伙伴一些指引&#xff0c;本文会持续更新的哦。 1、 CPU 和 GPU的区别 一个是通用计算&#xff0c;一个是专用计算。 CPU主要负责操作系统和应用程序&#xff0c;GPU主要负责跟…

针对图像分类的数据增强方法,离线增强,适合分类,无标签增强

针对图像分类的数据增强方法&#xff0c;离线增强&#xff0c;适合分类&#xff0c;无标签增强 代码&#xff1a; 改变路径即可使用 # 本代码主要提供一些针对图像分类的数据增强方法# 1、平移。在图像平面上对图像以一定方式进行平移。 # 2、翻转图像。沿着水平或者垂直方向…

【BUG解决】服务器没报警但是应用接口崩了....

最近遇到一个突发问题&#xff1a;服务器没报警但是应用接口崩了… 为其他业务系统提供一个接口&#xff0c;平时好好的&#xff0c;突然就嚷嚷反馈说访问不了了&#xff0c;吓得我赶紧跳起来&#xff01; 正常情况下在系统崩溃前&#xff0c;我会收到很多系统报警&#xff0…