算法基础--------【图论】

图论(待完善)

DFS:和回溯差不多
BFS:进while进行层序遍历

定义: 图论(Graph Theory)是研究图及其相关问题的数学理论。图由节点(顶点)和连接这些节点的边组成。图论的研究范围广泛,涉及路径、流、匹配、着色等诸多问题。

特点:
节点和边: 图论问题通常围绕节点(点)和边(线)展开,研究它们之间的关系。
图的种类: 包括无向图、有向图、加权图等不同类型的图,每种图有不同的应用场景。
算法: 常见的图论算法包括深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(如Dijkstra算法、Floyd-Warshall算法)、最小生成树算法(如Kruskal算法、Prim算法)等。(Dijkstra华子暑期实习笔试考了)
适用范围: 广泛用于网络分析、路径规划、资源分配等领域,如社交网络、交通系统、计算机网络等。(网络分析,路径规划这个真的很爱考)
示例: 最短路径问题(如寻找城市之间的最短路线)是一个经典的图论问题,通常用Dijkstra算法或Bellman-Ford算法解决。

【200】岛屿数量

要么用DFS的思想,要么用BFS层序遍历的思想
DFS:节点有四个方向,都遍历一遍,我写的逻辑是先下右上左。
dfs方法: 设目前指针指向一个岛屿中的某一点 (i, j),寻找包括此点的岛屿边界。
从 (i, j) 向此点的上下左右 (i+1,j),(i-1,j),(i,j+1),(i,j-1) 做深度搜索。
终止条件:
(i, j) 越过矩阵边界;
grid[i][j] == 0,代表此分支已越过岛屿边界。
搜索岛屿的同时,执行 grid[i][j] = ‘0’,即将岛屿所有节点删除,以免之后重复搜索相同岛屿。
主循环:
遍历整个矩阵,当遇到 grid[i][j] == ‘1’ 时,从此点开始做深度优先搜索 dfs,岛屿数 count + 1 且在深度优先搜索中删除此岛屿。
最终返回岛屿数 count 即可。

DFS:

class Solution {
public:int numIslands(vector<vector<char>>& grid) {if(grid.size() == 0 || grid[0].size() == 0)return 0;int m = grid.size(),n = grid[0].size();vector<vector<int>> vec;int res =0;for(int i =0;i<m;i++){vector<int> tempvec;for(int j=0;j<n;j++){   int tmp = grid[i][j]-'0';tempvec.push_back(tmp);//转化成int类型的}vec.push_back(tempvec);} for(int i =0;i<m;i++){for(int j=0;j<n;j++){if( vec[i][j] == 1){dfs(vec,i,j);//dfs的次数就是岛屿的数量res++;}}} return res;}   
private:void dfs(vector<vector<int>>& vec,int i, int j){if(i<0 || j<0 || i>vec.size()-1 || j>vec[0].size()-1)return;cout<<"(i,j) = "<<i<<j<<","<<vec[i][j]<<endl;if(vec[i][j] != 1)return;vec[i][j] =-1;//标记dfs(vec,i+1,j);dfs(vec,i,j+1);dfs(vec,i-1,j);dfs(vec,i,j-1);}
};
int main() {Solution s;vector<vector<char>> grid = {{'1','1','1','1','0'},{'1','1','0','1','0'},{'1','1','0','0','0'},{'0','0','0','0','0'}};s.numIslands(grid);system("pause");return 0;
}

BFS:
借用一个队列 queue,判断队列首部节点 (i, j) 是否未越界且为 1:
若是则置零(删除岛屿节点),并将此节点上下左右节点 (i+1,j),(i-1,j),(i,j+1),(i,j-1) 加入队列;
若不是则跳过此节点;
循环 pop 队列首节点,直到整个队列为空,此时已经遍历完此岛屿。

class Solution {
public:int numIslands(vector<vector<char>>& grid) {if (grid.empty() || grid[0].empty()) return 0;int m = grid.size(), n = grid[0].size();int res = 0;queue<pair<int, int>> q;for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] == '1') {q.push({i,j});grid[i][j] = '0'; // 标记为已访问 加入就标记res++;//第一层更新while (!q.empty()) {//BFS遍历int x = q.front().first, y = q.front().second;q.pop();for (const auto& dir : dirs) {int nx = x + dir.first, ny = y + dir.second;if (nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] == '1') {q.push({nx,ny});grid[nx][ny] = '0'; // 标记为已访问}}}}}}return res;}
private:vector<pair<int, int>> dirs{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};};

【994】腐烂的橘子

在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:

  • 0 代表空单元格;
  • 1 代表新鲜橘子;
  • 2 代表腐烂的橘子。

每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1

示例 1:

img

输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4
class Solution {
public:int orangesRotting(vector<vector<int>>& grid) {if(grid.size() == 0 ||grid[0].size() ==0)return -1;int m = grid.size();int n = grid[0].size();int min = 0;//分钟数int fresh = 0;//新鲜橘子queue<pair<int,int>> q;//存储腐烂的橘子for(int i =0;i<m;i++){for(int j =0;j<n;j++){if(grid[i][j] == 2){q.push({i,j});}else if(grid[i][j] == 1){//统计新鲜橘子fresh++;}}}// if(q.empty() || fresh==0 )return -1;//没有腐烂的橘子 没有新鲜的橘子vector<pair<int,int>> dirs = {{1,0},{0,1},{0,-1},{-1,0}};while(!q.empty()){//每一层int qsize = q.size();//有n个烂橘子bool flag = false;for(int i =0;i<qsize;i++){//遍历这n个烂橘子int x = q.front().first;int y = q.front().second;q.pop();for(auto dir:dirs){int nx = dir.first+x;int ny = dir.second+y;if(nx >=0 && nx<m && ny >=0 && ny<n && grid[nx][ny]==1){q.push({nx,ny});grid[nx][ny] = 2;fresh--;//到最后要没有新鲜橘子才结束flag = 1;//有新鲜橘子就标记}}}//一层就要++if(flag)min++;//有新鲜橘子才++}return fresh? -1:min;}
};

总结:腐烂的橘子是以各个腐烂的橘子为头结点开始入队遍历的,而岛屿数量是以有无1直接入队遍历。

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

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

相关文章

DNF手游鬼剑士攻略:全面解析流光星陨刀的获取与升级!云手机强力辅助!

《地下城与勇士》&#xff08;DNF&#xff09;手游是一款广受欢迎的多人在线角色扮演游戏&#xff0c;其中鬼剑士作为一个经典职业&#xff0c;因其强大的输出能力和炫酷的技能特效&#xff0c;吸引了众多玩家的青睐。在这篇攻略中&#xff0c;我们将详细介绍鬼剑士的一把重要武…

使用JavaScript的indexOf方法

使用JavaScript的indexOf方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨JavaScript中的indexOf方法。indexOf方法是JavaScript中一个非常实…

【Python报错】已解决 ModuleNotFoundError: No module named ‘transformers‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 ModuleNotFoundError: No module named ‘transformers’ 是一个常见的错误&#xff0c;它表明你的Python环境中没有安装t…

如何用CSS样式实现一个优雅的渐变效果?

CSS渐变效果 CSS渐变&#xff08;Gradients&#xff09;是一种让两种或多种颜色平滑过渡的视觉效果&#xff0c;广泛应用于网页背景、按钮、边框等&#xff0c;以创造丰富的视觉体验。CSS提供了线性渐变&#xff08;Linear Gradients&#xff09;和径向渐变&#xff08;Radial…

Socket编程详解(二)核心代码讲解

本文对代码的讲解基于上一篇博客 快速链接 Socket编程详解&#xff08;一&#xff09;服务端与客户端的双向对话 小试牛刀1&#xff1a;委托声明的关键字和委托方法使用的方法名是不一样的名称 可读性&#xff1a;有时&#xff0c;委托的名称可能描述了它的用途或它在哪里被…

使用Swoole开发高性能的Web爬虫

使用swoole开发高性能的web爬虫 Web爬虫是一种自动化获取网络数据的工具&#xff0c;它可以在互联网上收集数据&#xff0c;并且可以被应用于各种不同的领域&#xff0c;如搜索引擎、数据分析、竞争对手分析等。随着互联网规模和数据量的快速增长&#xff0c;如何开发一个高性…

RequestMappingHandlerAdapter【Spring源码学习】

HandlerAdapter处理器适配器就是去调用处理器方法&#xff01; HandlerAdapter // 解析RequestMapping注解 生成路径和控制器方法得映射关系 RequestMappingHandlerMapping requestMappingHandlerMapping context.getBean(RequestMappingHandlerMapping.class);// 查看生成的…

六、常用API ★ ✔

六、常用API 模块14.基础API第一章.String1.String介绍2.String的实现原理 ★private final char[] value;private final byte[] value; 3.String的创建 ★ &#xff08;无参、字符串、字符数组、字节数组&#xff09;4.String 面试题【String s new String("abc")】…

「树莓派入门」树莓派基础06-Linux操作系统和编辑器的使用

本文主要介绍如何在树莓派上使用终端进行基本操作&#xff0c;包括文件的创建、查看、删除和移动&#xff0c;以及如何使用超级用户权限和切换用户。同时&#xff0c;也介绍了如何使用nano和vi编辑器编辑文件。 一、连接树莓派 通过SSH连接 确保树莓派的SSH服务已启动。在终端…

Django —— 用户名和密码配置

创建项目ProjectA&#xff1a; django-admin startproject ProjectA cd进入ProjectA文件夹运行项目&#xff1a; python manage.py runserver 0.0.0.0:8000 Starting development server at http://0.0.0.0:8000/Quit the server with CTRL-BREAK. 访问http://localhost:80…

智慧校园-档案管理系统总体概述

智慧校园档案管理系统&#xff0c;作为教育信息化进程中的重要一环&#xff0c;它运用现代信息技术的力量&#xff0c;彻底改变了传统档案管理的面貌&#xff0c;为学校档案资源的收集、整理、存储、检索与利用开辟了全新的途径。这一系统全面覆盖学生、教职工、教学科研及行政…

驾驭Scala的网络之力:HTTP客户端与服务器实战指南

驾驭Scala的网络之力&#xff1a;HTTP客户端与服务器实战指南 在现代应用开发中&#xff0c;HTTP作为网络通信的基石&#xff0c;其重要性不言而喻。Scala&#xff0c;以其强大的函数式编程特性和类型系统&#xff0c;为构建高效、可靠的HTTP客户端和服务器提供了丰富的工具和…

2.ROS串口安装和调试

首先安装串口依赖 sudo apt-get install ros-melodic-serial 其次安装串口调试助手 sudo apt-get install minicom 再赋予串口权限 sudo chmod 777 /dev/ttyTHS1 打开调试助手 sudo cutecom 硬件引脚图&#xff1a;

【算法专题--栈】栈的压入、弹出序列 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 &#x1f4a7;栈模拟法&#x1f4a7;-- 双指针 ⭐ 解题思路 ⭐ 案例图解 四、总结与提炼 五、共勉 一、前言 栈的压入、弹出序列 这道题&#xff0c;可以说是--栈专题--&#xff0c;最经典的一道题&#xff0c;也是在…

前端通过ResizeObserver来监听dom大小动态渲染echarts

export const GlobalResizeObserver (function () {const ATTR_NAME global-resizeobserver-keyconst attrValueToCallback {}function antiShake(fn, delay, immediate false) {let timer null//不能用箭头函数return function () {//在时间内重复调用的时候需要清空之前…

Java 实现将List按照字符串(特定规则)排序

日常开发中我们通常会遇到将一个List按照特定的规则排序&#xff0c;例如我们需要将一个List按照 “广州市”, “深圳市”, “珠海市”, “汕头市” 的顺序排序&#xff0c;我们可以使用下述方式实现。 City实体类 import lombok.AllArgsConstructor; import lombok.Data; im…

如何使用飞书快捷指令无感记账,ios版

总结 很多人无法长期坚持记账&#xff0c;主要是每次消费需要打开手机软件&#xff0c;一系列繁琐的操作&#xff0c;导致过程中可能就忘了。 今天给大家带来飞书自动记账。 演示视频 点击查看&#xff1a;https://www.douyin.com/video/7312857946382241063 安装 下载快捷…

hive调优原理详解:案例解析参数配置(第17天)

系列文章目录 一、Hive常问面试函数&#xff08;掌握&#xff09; 二、Hive调优如何配置&#xff08;重点&#xff09; 文章目录 系列文章目录前言一、Hive函数&#xff08;掌握&#xff09;11、JSON数据处理12、炸裂函数13、高频面试题13.1 行转列13.2 列转行 14、开窗函数&a…

Vue2 基础八电商后台管理项目——中

代码下载 商品分类页 新商品分类组件 goods/Cate.vue&#xff0c;在router.js中导入子级路由组件 Cate.vue&#xff0c;并设置路由规则。 绘制商品分类基本结构 在Cate.vue组件中添加面包屑导航以及卡片视图中的添加分类按钮&#xff1a; <template><div><…

AcWing算法基础课笔记——记忆化搜索:滑雪

记忆化搜索 1. 滑雪 题目 题目描述&#xff1a; 给定一个R行C列的矩阵&#xff0c;表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发&#xff0c;每次可以向上下左右任意一个方向滑动一个单位…