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

【数据结构与算法】LeetCode:图论

文章目录

  • LeetCode:图论
    • 岛屿数量(Hot 100)
    • 岛屿的最大面积
    • 腐烂的橘子(Hot 100)
    • 课程表(Hot 100)

LeetCode:图论

岛屿数量(Hot 100)

岛屿数量

DFS:

class Solution {
private:int direction[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};void dfs(int posx, int posy, vector<vector<char>>& grid) {  // 越界了或者访问过的 或者是海洋的if (posx < 0 || posx >= grid.size() || posy < 0 || posy >= grid[0].size() || grid[posx][posy] == '0') {  return;  }  grid[posx][posy] = '0'; // 访问过,标记为海洋for (int i = 0; i < 4; i++) {  int posx_next = posx + direction[i][0];  int posy_next = posy + direction[i][1];  dfs(posx_next, posy_next, grid);  }  }
public:int numIslands(vector<vector<char>>& grid) {int m = grid.size();if (m == 0) return 0;int n = grid[0].size();int result = 0;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j] == '1'){  // 没有访问过且是陆地的result++; // 遇到没访问过的陆地,+1dfs(i, j, grid); // 将与其链接的陆地都标记上 true}}}return result;}
};

BFS:

class Solution {private:int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};void bfs(int posx, int posy, vector<vector<char>>& grid ){queue<pair<int, int>> que; // 存放当前能到达的陆地que.push({posx,posy});grid[posx][posy]='0';while(!que.empty()){pair<int, int> cur = que.front();posx = cur.first;posy = cur.second;que.pop();for(int i = 0; i < 4; i++){int posx_next = posx + dir[i][0];int posy_next = posy + dir[i][1];if(posx_next < 0 || posx_next >= grid.size()||posy_next<0||posy_next>=grid[0].size()||grid[posx_next][posy_next] == '0') continue;que.push({posx_next,posy_next});grid[posx_next][posy_next]='0';}}}
public:int numIslands(vector<vector<char>>& grid) {int m = grid.size();int n = grid[0].size();int result = 0;for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(grid[i][j] == '1'){result++;bfs(i,j,grid);}}}return result;}
};

岛屿的最大面积

岛屿的最大面积

class Solution {
private:int di[4] = {0, 0, 1, -1};int dj[4] = {1, -1, 0, 0};int dfs(vector<vector<int>>& grid, int cur_i, int cur_j) {if (cur_i < 0 || cur_j < 0 || cur_i == grid.size() || cur_j == grid[0].size() || grid[cur_i][cur_j] != 1) {return 0;}grid[cur_i][cur_j] = 0;int cur_max = 1;for (int index = 0; index != 4; ++index) {int next_i = cur_i + di[index], next_j = cur_j + dj[index];cur_max += dfs(grid, next_i, next_j);}return cur_max;}
public:int maxAreaOfIsland(vector<vector<int>>& grid) {int ans = 0;for (int i = 0; i != grid.size(); ++i) {for (int j = 0; j != grid[0].size(); ++j) {if(grid[i][j] == 1)  {int cur_max =  dfs(grid, i, j);ans = max(ans,cur_max);}}}return ans;}
};

BFS

class Solution {
private:int di[4] = {0, 0, 1, -1};int dj[4] = {1, -1, 0, 0};int bfs(vector<vector<int>>& grid, int i, int j){int cur_max = 0;             //  当前面积queue<pair<int, int>> q;     // 存放当前能到达的陆地q.push({i, j});  grid[i][j] = 0;              // 将当前单元格标记为已访问++cur_max;                   // 当前面积+1while (!q.empty()) {auto [cur_i, cur_j] = q.front();q.pop();for (int index = 0; index < 4; ++index) {int next_i = cur_i + di[index], next_j = cur_j + dj[index];if (next_i >= 0 && next_j >= 0 && next_i < grid.size() && next_j < grid[0].size() && grid[next_i][next_j] == 1) {q.push({next_i, next_j});  grid[next_i][next_j] = 0;      // 标记为已访问++cur_max;                     // 当前面积+1}}}return cur_max;}
public:int maxAreaOfIsland(vector<vector<int>>& grid) {int ans = 0;for (int i = 0; i < grid.size(); ++i) {for (int j = 0; j < grid[0].size(); ++j) {if (grid[i][j] == 1) {  // 只有在发现新的岛屿时才计算面积int cur_max = bfs(grid, i, j);ans = max(ans, cur_max); // 更新最大面积}}}return ans; }
};

腐烂的橘子(Hot 100)

腐烂的橘子

class Solution {  
private:int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
public:  int orangesRotting(vector<vector<int>>& grid) {  int n = grid.size(), m = grid[0].size(), ans = 0;    // 存储腐烂的橙子的位置  queue<pair<int, int>> que;          // 各个位置的橘子的腐烂时间  初始化距离数组为-1,表示未访问  vector<vector<int>>dis(10, vector<int>(10, -1));// 计数器,用于记录还有多少个新鲜的橙子  int cnt = 0;   // 遍历所有位置for (int i = 0; i < n; ++i) {  for (int j = 0; j < m; ++j) {  if (grid[i][j] == 2) { // 找到腐烂的橙子并加入队列  que.emplace(i, j);  dis[i][j] = 0;     // 这个橘子本身已经腐烂  }  else if (grid[i][j] == 1) { // 记录新鲜橙子的数量 cnt += 1;  }  }  }  // bfswhile (!que.empty()){  auto [x, y] = que.front();que.pop();  // 只考虑[x, y]腐烂的橘子,计算与其连接的其他橘子的腐烂时间  for (int i = 0; i < 4; ++i) {  int nx = x + dir[i][0];   // 下一个位置的x坐标  int ny = y + dir[i][1];   // 下一个位置的y坐标  // 越界 或者 已经被访问过 或者 空单元格, 则跳过if (nx < 0 || nx >= n || ny < 0 || ny >= m || dis[nx][ny] !=-1  || grid[nx][ny]== 0 ) continue;  // 如果这个位置是新鲜的橙子      dis[nx][ny] = dis[x][y] + 1;  // 更新腐烂时间que.emplace(nx, ny);          // 将新的腐烂橙子加入队列  cnt--;                        // 更新计数器ans = max(ans, dis[nx][ny]);  // 更新答案  // 如果所有的新鲜橙子都腐烂了,则可以提前结束循环  if (cnt == 0) break;   }  }  // 如果还有新鲜橙子(cnt != 0)未腐烂,则返回-1;否则返回腐烂所需的时间  return cnt ? -1 : ans;  }  
};

课程表(Hot 100)

课程表

class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {// 入度数组:各个课程的先修课程数量vector<int> indegrees(numCourses, 0);// 邻接表:各个课程的先修课程列表vector<vector<int>> adjacency(numCourses);// 存储当前可以学习的课程queue<int> q; // 获取每个课程的入度和邻接关系for (const auto& temp : prerequisites) {int cur = temp[0];int pre = temp[1];indegrees[cur]++; // cur的先修课程数量+1adjacency[pre].push_back(cur); // pre是cur的先修课程}// 将所有入度为0的课程加入队列,入度为0的课程不依赖于其他课程// 意味着学生可以直接学习这门课程,而不需要先完成其他任何课程。for (int i = 0; i < numCourses; ++i) {if (indegrees[i] == 0) q.push(i);}// bfswhile (!q.empty()) {int pre = q.front();q.pop();numCourses--; // 表示已经完成一门课程  // adjacency[pre]: 学习完pre,才可以学习的课程for (int cur : adjacency[pre]) {indegrees[cur]--; // 学习cur的还需要学习的先修课程减1if (indegrees[cur] == 0) q.push(cur);}}// 如果所有课程都能完成,则返回truereturn numCourses == 0;}
};

相关文章:

【数据结构与算法】LeetCode:图论

文章目录 LeetCode&#xff1a;图论岛屿数量&#xff08;Hot 100&#xff09;岛屿的最大面积腐烂的橘子&#xff08;Hot 100&#xff09;课程表&#xff08;Hot 100&#xff09; LeetCode&#xff1a;图论 岛屿数量&#xff08;Hot 100&#xff09; 岛屿数量 DFS: class So…...

YOLOv8 基于NCNN的安卓部署

YOLOv8 NCNN安卓部署 前两节我们依次介绍了基于YOLOv8的剪枝和蒸馏 本节将上一节得到的蒸馏模型导出NCNN&#xff0c;并部署到安卓。 NCNN 导出 YOLOv8项目中提供了NCNN导出的接口&#xff0c;但是这个模型放到ncnn-android-yolov8项目中你会发现更换模型后app会闪退。原因…...

【Python|接口自动化测试】使用requests发送http请求时添加headers

文章目录 1.前言2.HTTP请求头的作用3.在不添加headers时4.反爬虫是什么&#xff1f;5.在请求时添加headers 1.前言 本篇文章主要讲解如何使用requests请求时添加headers&#xff0c;为什么要加headers呢&#xff1f;是因为有些接口不添加headers时&#xff0c;请求会失败。 2…...

需求管理工具Jama Connect:与Jira/Slack/GitHub无缝集成,一站式解决复杂产品开发中的协作难题

在产品和软件开发的动态世界中&#xff0c;有效协作是成功的关键。然而&#xff0c;团队往往面临着阻碍进步和创新的重大挑战。了解这些挑战并找到强有力的解决方案&#xff0c;对于实现无缝、高效的团队协作至关重要。Jama Connect就是这样一种解决方案&#xff0c;它是一个功…...

CSP-J/S 复赛算法 背包DP

文章目录 前言背包DP的简介问题描述目标解决方法1. **定义状态**2. **状态转移方程**3. **初始化**4. **目标**举个例子动态规划解决背包问题的核心 DP背包问题示例代码问题描述代码实现核心代码讲解&#xff1a;举例&#xff1a;总结&#xff1a; 总结 前言 背包问题是算法竞…...

如何评估和部署 IT 运维系统?

如何才能将如此新兴、流行的技术转化为企业中实用的系统环境呢&#xff1f; 为此&#xff0c;我们采访了一家已经成功部署IT运维体系的大型企业的IT总监龙先生&#xff0c;请他给我们讲一下企业应该如何真正评估和部署自己的IT运维体系。 真理就是价值。 1.评估选择&#xf…...

正态分布的极大似然估计一个示例,详细展开的方程求解步骤

此示例是 什么是极大似然估计 中的一个例子&#xff0c;本文的目的是给出更加详细的方程求解步骤&#xff0c;便于数学基础不好的同学理解。 目标 假设我们有一组样本数据 x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x1​,x2​,…,xn​&#xff0c;它们来自一个正态分布 N…...

s7-200SMART编程软件下载

1、官网&#xff1a; STEP 7 Micro/WIN SMART V2.2 完整版http://w2.siemens.com.cn/download/smart/STEP%207%20MicroWIN%20SMART%20V2.2.zip STEP 7 Micro/WIN SMART V2.3 完整版http://w2.siemens.com.cn/download/smart/STEP%207%20MicroWIN%20SMART%20V2.3.iso STEP 7 Mi…...

Linux驱动开发常用调试方法汇总

引言&#xff1a;在 Linux 驱动开发中&#xff0c;调试是一个至关重要的环节。开发者需要了解多种调试方法&#xff0c;以便能够快速定位和解决问题。 1.利用printk 描述&#xff1a; printk 是 Linux 内核中的一个调试输出函数&#xff0c;类似于用户空间中的 printf。它用于…...

将列表中的各字符串sn连接成为一个字符串s使用;将各sn间隔开os.pathsep.join()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 将列表中的各字符串sn 连接成为一个字符串s 使用;将各sn间隔开 os.pathsep.join() [太阳]选择题 下列说法中正确的是? import os paths ["/a", "/b/c", "/d&q…...

算法题总结(八)——字符串

531、反转字符串二 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c…...

大数据开发--1.2 Linux介绍及虚拟机网络配置

目录 一. 计算机入门知识介绍 软件和硬件的概述 硬件 软件 操作系统概述 简单介绍 常见的系统操作 学习Linux系统 二. Linux系统介绍 简单介绍 发行版介绍 常用的发行版 三. Linux系统的安装和体验 Linux系统的安装 介绍 虚拟机原理 常见的虚拟机软件 体验Li…...

2024CSP-J复赛易错点

低级错误 不开long long见祖宗写代码要有输入&#xff0c;别没写输入就交写完代码要在本地测试&#xff0c;多想写极端测试数据&#xff0c;或对拍注意考官说文件夹怎么建&#xff0c;别文件夹建错&#xff0c;爆0别忘写freopen或忘给freopen去注释记着把.exe文件删掉考试时不…...

pytorch 与 pytorch lightning, pytorch geometric 各个版本之间的关系

主要参考 官方的给出的意见&#xff1b; 1. pytorch 与 pytorch lightning 各个版本之间的关系 lightning 主要可以 适配多个版本的 torch; https://lightning.ai/docs/pytorch/latest/versioning.html#compatibility-matrix&#xff1b; 2. pytorch 与 pytorch geometric 各…...

Spring Boot项目的创建与使用

1.通过IDE创建Spring Boot项目 2.目录结构 3.新建TestController控制器 Controller public class TestController {RequestMapping("/test")public ModelAndView test(RequestParam(name "name", defaultValue "刘德华") String name){ModelA…...

pytorch常用函数view、sum、sequeeze、cat和chunk

文章目录 view()函数sequeeze和unsequeezecat和chunk函数sum函数view()函数 view()相当于reshape、resize,重新调整Tensor的形状。 指定调整形状之后的维度import torch re = torch.tensor([1, 2, 3, 4, 5...

【STM32开发之寄存器版】(四)-独立看门狗IWDG

一 、前言 独立看门狗简介&#xff1a; STM32F103ZET6内置两个看门狗&#xff0c;提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障。 独立看门狗主要性能&#xff1a; 自由运行的递减计数器时钟…...

【S32K3 RTD MCAL 篇1】 K344 KEY 控制 EMIOS PWM

【S32K3 RTD MCAL 篇1】 K344 KEY 控制 EMIOS PWM 一&#xff0c;文档简介二&#xff0c; 功能实现2.1 软硬件平台2.2 软件控制流程2.3 资源分配概览2.4 EB 配置2.4.1 Dio module2.4.2 Icu module2.4.4 Mcu module2.4.5 Platform module2.4.6 Port module2.4.7 Pwm module 2.5 …...

华为OD机试真题---绘图机器(计算面积)

题目描述 绘图机器的绘图笔初始位置在原点(0,0)&#xff0c;机器启动后按照以下规则绘制直线&#xff1a; 尝试沿着横线坐标正向绘制直线直到给定的终点E。期间可以通过指令在纵坐标轴方向进行偏移&#xff0c;offsetY为正数表示正向偏移&#xff0c;为负数表示负向偏移。 给…...

HarmonyOs 查看官方文档使用弹窗

1. 学会查看官方文档 HarmonyOS跟上网上的视频学习一段时间后&#xff0c;基本也就入门了&#xff0c;但是有一些操作网上没有找到合适教学的视频&#xff0c;这时&#xff0c;大家就需要养成参考官方文档的习惯了&#xff0c;因为官方的开发文档是我们学习深度任何一门语言或…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...