代码随想录Day41-图论:力扣第797m、200m、695m、1020m、130m题

797m. 所有可能的路径

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

方法一:DFS

用时:11m43s

思路
  • 时间复杂度: O ( n ⋅ 2 n ) O(n \cdot 2^n) O(n2n),n是节点个数,最坏情况每个节点都可以去往任意一个在它后面的节点,那么第i个节点去到最后一个节点的路径数就有 2 n − i − 2 2^{n-i-2} 2ni2,就是当前节点和最后一个节点必走,其他的节点有两种选择——走或不走。
  • 空间复杂度: O ( n ) O(n) O(n)
C++代码
class Solution {
private:vector<vector<int>> res;vector<int> path;void backTracking(vector<vector<int>>& graph, int i) {if (i == graph.size() - 1) {res.push_back(path);return;}for (int j = 0; j < graph[i].size(); ++j) {path.push_back(graph[i][j]);backTracking(graph, graph[i][j]);path.pop_back();  // 回溯}}public:vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {path.push_back(0);backTracking(graph, 0);return res;}
};

方法二:BFS

用时:16m18s

思路

队列中记录的元素是路径。

  • 时间复杂度: O ( ) O() O()
  • 空间复杂度: O ( ) O() O()
C++代码
class Solution {
public:vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {queue<vector<int>> que;vector<vector<int>> res;que.push({0});while (!que.empty()) {vector<int> path = que.front();que.pop();for (int i = 0; i < graph[path.back()].size(); ++i) {vector<int> tmp = path;tmp.push_back(graph[path.back()][i]);if (tmp.back() == graph.size() - 1) res.push_back(tmp);else que.push(tmp);}}return res;}
};

看完讲解的思考

无。

代码实现遇到的问题

无。


200m. 岛屿数量

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

方法一:DFS

用时:17m48s

思路

遍历每个元素,若是陆地则使用DFS搜索与之相邻的所有陆地,并使用一个二维数组记录哪些陆地已经遍历过。
当遍历到新的岛屿时,岛屿数加1。

  • 时间复杂度: 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;int dir[4][2] = {0, -1, 1, 0, 0, 1, -1, 0};void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {visited[x][y] = true;for (int i = 0; i < 4; ++i) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (!(nextx < 0 || nextx >= m || nexty < 0 || nexty >= n) && !visited[nextx][nexty] && grid[nextx][nexty] == '1') dfs(grid, visited, nextx, nexty);}}public:int numIslands(vector<vector<char>>& grid) {m = grid.size();n = grid[0].size();vector<vector<bool>> visited(m, vector<bool>(n, false));int res = 0;for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (!visited[i][j] && grid[i][j] == '1') {++res;dfs(grid, visited, i, j);}}}return res;}
};

方法二:方法一优化

思路

可以不用数组记录哪些陆地访问过,只用把访问过的陆地置0即可。

  • 时间复杂度: 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;int dir[4][2] = {0, -1, 1, 0, 0, 1, -1, 0};void dfs(vector<vector<char>>& grid, int x, int y) {grid[x][y] = '0';for (int i = 0; i < 4; ++i) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (!(nextx < 0 || nextx >= m || nexty < 0 || nexty >= n) && grid[nextx][nexty] == '1') dfs(grid, nextx, nexty);}}public:int numIslands(vector<vector<char>>& grid) {m = grid.size();n = grid[0].size();int res = 0;for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] == '1') {++res;dfs(grid, i, j);}}}return res;}
};

看完讲解的思考

代码实现遇到的问题

方法三:BFS

思路
  • 时间复杂度: O ( m ⋅ n ) O(m \cdot n) O(mn)
  • 空间复杂度: O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))
C++代码
class Solution {
private:int m;int n;int dir[4][2] = {0, -1, 1, 0, 0, 1, -1, 0};void bfs(vector<vector<char>>& grid, int x, int y) {queue<pair<int, int>> que;grid[x][y] = '0';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] == '1') {grid[nextx][nexty] = '0';que.push(pair<int, int>(nextx, nexty));}}}}public:int numIslands(vector<vector<char>>& grid) {m = grid.size();n = grid[0].size();int res = 0;for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] == '1') {++res;bfs(grid, i, j);}}}return res;}
};

看完讲解的思考

无。

代码实现遇到的问题

无。


695m. 岛屿的最大面积

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

方法一:DFS

用时:16m39s

思路

当遇到陆地时,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;int area;void dfs(vector<vector<int>>& grid, int x, int y) {grid[x][y] = 0;area += 1;if (x - 1 >= 0 && grid[x - 1][y] == 1) dfs(grid, x - 1, y);if (x + 1 < m && grid[x + 1][y] == 1) dfs(grid, x + 1, y);if (y - 1 >= 0 && grid[x][y - 1] == 1) dfs(grid, x, y - 1);if (y + 1 < n && grid[x][y + 1] == 1) dfs(grid, x, y + 1);}public:int maxAreaOfIsland(vector<vector<int>>& grid) {int res = 0;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) {area = 0;dfs(grid, i, j);res = max(res, area);}}}return res;}
};

方法二:BFS

思路
  • 时间复杂度: O ( m ⋅ n ) O(m \cdot n) O(mn)
  • 空间复杂度: O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))
C++代码
class Solution {
private:int m;int n;int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};int bfs(vector<vector<int>>& grid, int x, int y) {int area = 1;queue<pair<int, int>> que;que.push(pair<int, int>(x, y));grid[x][y] = 0;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] == 1) {grid[nextx][nexty] = 0;area += 1;que.push(pair<int, int>(nextx, nexty));}}}return area;}public:int maxAreaOfIsland(vector<vector<int>>& grid) {int res = 0;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) res = max(res, bfs(grid, i, j));}}return res;}
};

看完讲解的思考

无。

代码实现遇到的问题

BFS时,元素入列的时候就要做标记,不能在元素出列的时候才做标记,不然会重复遍历。


1020m. 飞地的数量

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

方法一:DFS

用时:20m42s

思路

在上一题695m的基础上,加多一个变量用于记录当前岛屿是否临界,如果不是的话将岛屿的陆地数量记录。

  • 时间复杂度: 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;int num;bool flag;void dfs(vector<vector<int>>& grid, int x, int y) {grid[x][y] = 0;num += 1;if (x - 1 < 0) flag = true;else if (grid[x - 1][y] == 1) dfs(grid, x - 1, y);if (x + 1 >= m) flag = true;else if (grid[x + 1][y] == 1) dfs(grid, x + 1, y);if (y - 1 < 0) flag = true;else if (grid[x][y - 1] == 1) dfs(grid, x, y - 1);if (y + 1 >= n) flag = true;else if (grid[x][y + 1] == 1) dfs(grid, x, y + 1);}public:int numEnclaves(vector<vector<int>>& grid) {int res = 0;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) {num = 0;flag = false;dfs(grid, i, j);if (!flag) res += num;}}}return res;}
};

方法二:BFS

思路
  • 时间复杂度: O ( m ⋅ n ) O(m \cdot n) O(mn)
  • 空间复杂度: O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))
C++代码
class Solution {
private:int m;int n;int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};int bfs(vector<vector<int>>& grid, int x, int y) {int num = 1;queue<pair<int, int>> que;que.push(pair<int, int>(x, y));grid[x][y] = 0;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) num = INT_MIN;else if (grid[nextx][nexty] == 1) {grid[nextx][nexty] = 0;++num;que.push(pair<int, int>(nextx, nexty));}}}return num;}public:int numEnclaves(vector<vector<int>>& grid) {int res = 0;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) res += max(0, bfs(grid, i, j));}}return res;}
};

看完讲解的思考

无。

代码实现遇到的问题

无。


130m. 被围绕的区域

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

方法一:DFS

用时:17m13s

思路

遍历位于临界的元素,若是’O’则将连通的’O’变成’H’,最后再将board中的所有’O’替换成’X’,‘H’替换成’O’,因为此时剩下的’O’是位于board内部的无法连接到外部的元素,直接将其变成’X’,而’H’是可以连通到外部的’O’,将其变回’O’。

  • 时间复杂度: 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<char>>& board, int x, int y) {board[x][y] = 'H';if (x - 1 >= 0 && board[x - 1][y] == 'O') dfs(board, x - 1, y);if (x + 1 < m && board[x + 1][y] == 'O') dfs(board, x + 1, y);if (y - 1 >= 0 && board[x][y - 1] == 'O') dfs(board, x, y - 1);if (y + 1 < n && board[x][y + 1] == 'O') dfs(board, x, y + 1);}public:void solve(vector<vector<char>>& board) {m = board.size();n = board[0].size();for (int i = 0; i < m; ++i) {if (board[i][0] == 'O') dfs(board, i, 0);if (board[i][n - 1] == 'O') dfs(board, i, n - 1);}for (int i = 0; i < n; ++i) {if (board[0][i] == 'O') dfs(board, 0, i);if (board[m - 1][i] == 'O') dfs(board, m - 1, i);}for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (board[i][j] == 'H') board[i][j] = 'O';else if (board[i][j] == 'O') board[i][j] = 'X';}}}
};

方法二:BFS

思路

就是遍历的方法从DFS换成BFS,懒得写了。

  • 时间复杂度: O ( m ⋅ n ) O(m \cdot n) O(mn)
  • 空间复杂度: O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n))

看完讲解的思考

无。

代码实现遇到的问题

无。


最后的碎碎念

就快要一刷完代码随想录,冲!

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

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

相关文章

【JavaScript保姆级教程】switch分支与while循环

文章目录 前言一、Switch分支1.1 switch基本结构1.2 break语句1.3 default标签1.4 下面是几个Switch分支的示例代码&#xff1a;示例1: 根据星期数输出对应的中文星期名称示例2: 根据用户输入的颜色选择执行不同的操作 二、While循环&#xff1a;2.1 while循环基本格式2.2 cont…

一文速通Sentinel熔断及降级规则

目录 基本介绍 熔断模式 状态机的三个状态 熔断降级规则 断路器熔断策略 慢调用 异常比例 异常数 基本介绍 熔断模式 主要是参考电路熔断&#xff0c;如果一条线路电压过高&#xff0c;保险丝会熔断&#xff0c;防止火灾。放到我们的系统中&#xff0c;如果某个目标…

MPI并行计算的基本介绍和使用

文章目录 MPI基本概念一般实现操作分类基本语句windows下使用Microsoft MPI 示例 点对点通信标准通信缓存通信同步通信就绪通信 MPI组通信广播 - 一对多收集散发组收集归约(reduce)归约并散发 MPI 基本概念 MPI(Message Passin Interface 消息传递接口)是一种消息传递编程模型…

云安全-云原生基于容器漏洞的逃逸自动化手法(CDK check)

0x00 docker逃逸的方法种类 1、不安全的配置&#xff1a; 容器危险挂载&#xff08;挂载procfs&#xff0c;Scoket&#xff09; 特权模式启动的提权&#xff08;privileged&#xff09; 2、docker容器自身的漏洞 3、linux系统内核漏洞 这里参考Twiki的云安全博客&#xff0c;下…

【通关选择】upload-labs通关攻略(全)

前提条件&#xff1a; 1.文件能够成功上传到服务器 2.攻击者能够知道文件的上传路径 upload-labs靶场 Pass-01&#xff08; 前端验证&#xff09; 三种方法解决思路 1.禁用客户端JavaScript弹窗 2.通过burp抓包&#xff0c;修改后缀名 3.f12删除return filecheck&#xff0…

测试用例设计——WEB通用测试用例

现在项目做完了&#xff0c;我觉得还是有必要总结一下&#xff0c;学习到的内容。毕竟有总结才能有提高嘛&#xff01;总结一下通用的东西&#xff0c;不管什么项目基本都可能会遇到&#xff0c;有写地方也有重复的或者有的是按照个人的习惯来总结的不一定都对&#xff0c;有不…

【深度学习】pytorch——实现CIFAR-10数据集的分类

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 往期文章&#xff1a; 【深度学习】pytorch——快速入门 CIFAR-10分类 CIFAR-10简介CIFAR-10数据集分类实现步骤一、数据加载及预处理实现数据加载及预处理归一化的理解访问数据集Dataset对象Dataloader对象 二、…

HTML区块、布局

HTML区块&#xff1a; HTML可以通过<div> 和 <span>将元素组合起来。大多数HTML元素被定义为块级元素或内联元素。块级元素在浏览器显示时&#xff0c;通常会以新行来开始、结束&#xff1b;内联元素在显示时通常不会以新行开始。 HTML<div>元素是块级元素…

JavaWeb 怎么在servlet向页面输出Html元素?

service()方法里面的方法体&#xff1a; resp.setContentType("text/html;charsetutf-8");//获得输出流PrintWriter对象PrintWriter outresp.getWriter();out.println("<html>");out.println("<head><title>a servlet</title>…

docker部署minio并使用springboot连接

需求&#xff1a;工作中&#xff0c;在微信小程序播放时&#xff0c;返回文件流并不能有效的使用&#xff0c;前端需要一个可以访问的地址&#xff0c;springboot默认是有资源拦截器的&#xff0c;但是不适合生产环境的使用 可以提供使用的有例如fastdfs或者minio&#xff0c;这…

Qt实现的自定义登录框连接MySQL(完整的实现过程)

一.开始创建项目 1.创建Qt窗口应用项目: 2.输入文件名、选择项目将要保存的地址 3.构造系统选择qmake 4.类名使用默认的就好,点击继续完成项目的创建 5.创建好的项目如下 二.创建一个资源管理文件 三.创建一个登录对话框窗口 1.选择一个ui界面类 2.选择Dialog without Butt…

git生成gitee和github两个不同的公钥

配置多个公钥 Windows 用户建议使用 Windows PowerShell 或者 Git Bash&#xff0c;在 命令提示符 下无 cat 和 ls 命令。 1、生成公钥文件&#xff1a; 通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t rsa -C "Gitee SSH Key" -f ~/.ssh/gitee_be…

【Unity ShaderGraph】| 快速制作一个 抖动效果

前言 【Unity ShaderGraph】| 快速制作一个 抖动效果一、效果展示二、UV抖动效果三、应用实例 前言 本文将使用ShaderGraph制作一个抖动效果&#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xff1a;【Unity ShaderGraph】| Shader Gr…

dash--项目的前端展示简单基础

1.前置工作 创建虚拟环境&#xff1a; sudo apt-get install python3-venv # 安装 python3 -m venv venv # 在本目录下创建venv虚拟环境&#xff08;也是一个文件夹。如果用不到这个虚拟环境以后就rm -rf venv&#xff09; source venv/bin/activate # 激活虚拟环境临时使用清华…

【WIFI】设置界面无法打开WiFi

一般这类问题优先检查下WIFI的ko文件是否加载成功 查看开机抓的kernel log可以看到如下信息, 说明出现大量的ko文件加载失败 行 3207: <14>[ 12.831274] .(1)[1:init]init 23: [12809][0]Command insmod /vendor/lib/modules/fpsgo.ko action=boot (/vendor/etc/ini…

poi兴趣点推荐数据集介绍

介绍 foursquare数据集包含2153471个用户&#xff0c;1143092个场所&#xff0c;1021970个签到&#xff0c;27098490个社交关系以及用户分配给场所的2809581评级&#xff0c;我们常用的是根据NYC和TKY都是从该数据集中抽取出来的。 下载地址&#xff1a;https://sites.google.…

D盘清空了怎么还原?3个恢复技巧大公开!

“由于我的文件一般都是保存在c盘的&#xff0c;d盘里没有什么文件&#xff0c;于是我在清理电脑时就把d盘清空了&#xff0c;但我突然想起有一个重要的文件夹在d盘中&#xff0c;现在还有办法找回这些文件吗&#xff1f;” D盘作为电脑的一个重要磁盘&#xff0c;有时候我们也…

损失函数总结(十三):RSELoss、MAPELoss

损失函数总结&#xff08;十三&#xff09;&#xff1a;RSELoss、MAPELoss 1 引言2 损失函数2.1 RSELoss2.2 MAPELoss 3 总结 1 引言 在前面的文章中已经介绍了介绍了一系列损失函数 (L1Loss、MSELoss、BCELoss、CrossEntropyLoss、NLLLoss、CTCLoss、PoissonNLLLoss、Gaussia…

day52【子序列】300.最长递归子序列 674.最长连续递增序列 718.最长重复子数组

文章目录 300.最长递增子序列674.最长连续递增序列718.最长重复子数组 300.最长递增子序列 题目链接&#xff1a;力扣链接 讲解链接&#xff1a;代码随想录链接 题意&#xff1a;给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而…

最新ai系统ChatGPT商业运营版网站源码+支持GPT4.0/支持AI绘画+已支持OpenAI GPT全模型+国内AI全模型+绘画池系统

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…