图论回溯

图论

200.岛屿数量DFS

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。

深度优先遍历:用一个visited数组标记所有访问过的地方,遍历图,遇到第一个陆地且没被访问过,就用深搜遍历此岛屿的全部陆地。

class Solution {
private:int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};void dfs(vector<vector<bool>>& visit, vector<vector<char>>& grid, int x, int y){for(int i = 0; i < 4; i++) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;if(!visit[nextx][nexty] && grid[nextx][nexty] == '1') {visit[nextx][nexty] = true;dfs(visit, grid, nextx, nexty);}}}
public:int numIslands(vector<vector<char>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<bool>> visit = vector<vector<bool>>(n, vector<bool>(m, false));int result = 0;for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {if(!visit[i][j] && grid[i][j] == '1') {result++;visit[i][j] = true;dfs(visit, grid, i, j);}}}return result;}
};

994.腐烂的橘子BFS

在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。

class Solution {
public:int orangesRotting(vector<vector<int>>& grid) {int n = grid.size(), m = grid[0].size();queue<pair<int, int>> q;int fresh = 0;for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {if(grid[i][j] == 2) {q.push({i,j});}else if(grid[i][j] == 1) {fresh++;}}}int time = 0;int dir[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};while(!q.empty() && fresh > 0) {int size = q.size();while(size--) {auto [x, y] = q.front(); q.pop();for(int i = 0; i < 4;i++) {int nx = x + dir[i][0];int ny = y + dir[i][1];if(nx < 0 || ny < 0 || nx >= grid.size() || ny >= grid[0].size() || grid[nx][ny] != 1) continue;grid[nx][ny] = 2;q.push({nx,ny});fresh--;}}time++;}return fresh == 0 ? time : -1;}
};

207.课程表

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。
例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

本题可约化为: 课程安排图是否是 有向无环图(DAG)。
方法一:入度表(广度优先遍历)
算法流程:
统计课程安排图中每个节点的入度,生成 入度表 indegrees。
借助一个队列 queue,将所有入度为 0 的节点入队。
当 queue 非空时,依次将队首节点出队,在课程安排图中删除此节点 pre:
并不是真正从邻接表中删除此节点 pre,而是将此节点对应所有邻接节点 cur 的入度 −1,即 indegrees[cur] -= 1。
当入度 −1后邻接节点 cur 的入度为 0,说明 cur 所有的前驱节点已经被 “删除”,此时将 cur 入队。
在每次 pre 出队时,执行 numCourses–;
若整个课程安排图是有向无环图(即可以安排),则所有节点一定都入队并出队过,即完成拓扑排序。换个角度说,若课程安排图中存在环,一定有节点的入度始终不为 0。
因此,拓扑排序出队次数等于课程个数,返回 numCourses == 0 判断课程是否可以成功安排。

class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {vector<vector<int>> adjacency(numCourses);vector<int> indegrees(numCourses, 0);queue<int> q;for(const auto& pair : prerequisites) {int course = pair[0], pre = pair[1];indegrees[course]++;adjacency[pre].push_back(course);}for(int i = 0; i < indegrees.size(); i++) {if(indegrees[i] == 0) q.push(i);}while(!q.empty()){int pre = q.front(); q.pop();numCourses--;for(int i = 0; i < adjacency[pre].size(); i++) {if(--indegrees[adjacency[pre][i]] == 0)q.push(adjacency[pre][i]);}}return numCourses == 0;}
};

208.前缀树

Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。
请你实现 Trie 类:
Trie() 初始化前缀树对象。
void insert(String word) 向前缀树中插入字符串 word 。
boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。路漫漫我不畏;

class Trie {
private:bool isEnd;Trie* next[26];
public:Trie() {isEnd = false;memset(next, 0, sizeof(next));}void insert(string word) {Trie* node = this;for(char ch : word){if(node->next[ch - 'a'] == NULL) {node->next[ch - 'a'] = new Trie();}node = node->next[ch - 'a'];}node->isEnd = true;}bool search(string word) {Trie* node = this;for(char ch : word) {node = node->next[ch - 'a'];if(node == NULL) return false;}return node->isEnd;}bool startsWith(string prefix) {Trie* node = this;for(char ch : prefix) {node = node->next[ch - 'a'];if(node == NULL) return false;}return true;}
};/*** Your Trie object will be instanti`ated and called as such:* Trie* obj = new Trie();* obj->insert(word);* bool param_2 = obj->search(word);* bool param_3 = obj->startsWith(prefix);*/

全排列

46. 全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
在这里插入图片描述

class Solution {
private:vector<int> path;vector<vector<int>> result;void backtracking(vector<int> & nums, vector<bool>& used){if(path.size() == nums.size()) {result.push_back(path);return;}for(int i = 0; i < nums.size(); i++){if(used[i] == true) continue;path.push_back(nums[i]);used[i] = true;backtracking(nums, used);used[i] = false;path.pop_back();}}
public:vector<vector<int>> permute(vector<int>& nums) {path.clear();result.clear();vector<bool> used(nums.size(), false);backtracking(nums,used);return result;}
};

78.子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
在这里插入图片描述
子集问题、组合问题、分割问题可以抽象成树,组合和分割是收集树的叶子结点,而子集是找树的所有结点。

class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums, int startIndex)  {result.push_back(path);for(int i = startIndex; i < nums.size(); i++) {path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}vector<vector<int>> subsets(vector<int>& nums) {backtracking(nums, 0);return result;}
};

17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
在这里插入图片描述

class Solution {
private:const string letterMap[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:vector<string> result;string s;void backtracking(const string& digits, int index) {if(digits.size() == index) {result.push_back(s);return;}int digit = digits[index] - '0';string letter = letterMap[digit];for(int i = 0; i < letter.size(); i++){s.push_back(letter[i]);backtracking(digits, index + 1);s.pop_back();}}vector<string> letterCombinations(string digits) {s.clear();result.clear();if(digits.size() == 0)return result;backtracking(digits, 0);return result;}
};

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

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

相关文章

真实网络项目中交换机常用的配置与解析

一、配置三层链路聚合增加链路带宽 1.组网需求 某企业有多个部门分布在不同的地区&#xff0c;由于业务发展的需要&#xff0c;不同区域的部门与部门之间有进行带有VLAN Tag的报文的传输需求。采用透明网桥的远程桥接和QinQ功能&#xff0c;可以实现企业在不同区域部门之间进…

【Redis】过期键删除策略,LRU和LFU在redis中的实现,缓存与数据库双写一致性问题,go案例

一、Redis 中的过期键删除策略有哪些&#xff1f; 采用了 惰性删除 和 定期删除 两种策略处理过期键&#xff1a; 1. 惰性删除&#xff08;Lazy Deletion&#xff09; 机制&#xff1a;只有在访问 key 时才检查是否过期&#xff0c;如果已过期则立刻删除。优点&#xff1a;对…

为什么单张表索引数量建议控制在 6 个以内

单张表索引数量建议控制在6个以内的主要原因包括以下几点‌&#xff1a; ‌性能影响‌&#xff1a;索引会占用额外的磁盘空间。如果索引数量过多&#xff0c;会占用大量的磁盘空间&#xff0c;尤其是在数据量较大的情况下&#xff0c;索引占用的空间可能会超过数据本身。此外&…

深度学习实战109-智能医疗随访与健康管理系统:基于Qwen3(32B)、LangChain框架、MCP协议和RAG技术研发

大家好,我是微学AI,今天给大家介绍一下深度学习实战109-智能医疗随访与健康管理系统:基于Qwen3(32B)、LangChain框架、MCP协议和RAG技术研发。在当今医疗信息化快速发展的背景下,医疗随访与健康管理面临着数据分散、信息整合困难、个性化方案生成效率低等挑战。传统的医疗随…

聊一聊 .NET Dump 中的 Linux信号机制

一&#xff1a;背景 1. 讲故事 当 .NET程序 在Linux上崩溃时&#xff0c;我们可以配置一些参考拿到对应程序的core文件&#xff0c;拿到core文件后用windbg打开&#xff0c;往往会看到这样的一句信息 Signal SIGABRT code SI_USER (Sent by kill, sigsend, raise)&#xff0c…

如何在uniapp H5中实现路由守卫

目录 Vue3 app.config.globalProperties 1. 创建 Vue 应用实例 2. 添加全局属性或方法 3. 在组件中使用全局属性或方法 beforeEach在uniapp的注册 1、在H5中这两个对象是都存在的。「router:route」但是功能并不全面,具体可参考下图。 2、刚刚测试了一下,在微信小程序…

无人机降落伞设计要点难点及原理!

一、设计要点 1. 伞体结构与折叠方式 伞体需采用轻量化且高强度的材料&#xff08;如抗撕裂尼龙或芳纶纤维&#xff09;&#xff0c;并通过多重折叠设计&#xff08;如三重折叠缝合&#xff09;减少展开时的阻力&#xff0c;同时增强局部承力区域的强度。 伞衣的几何参数&am…

AI时代新词-AI增强现实(AI - Enhanced Reality)

一、什么是AI增强现实&#xff08;AI - Enhanced Reality&#xff09;&#xff1f; AI增强现实&#xff08;AI - Enhanced Reality&#xff09;是指将人工智能&#xff08;AI&#xff09;技术与增强现实&#xff08;Augmented Reality&#xff0c;简称AR&#xff09;技术相结合…

基于Matlab实现各种光谱数据预处理

在IT领域&#xff0c;尤其是在数据分析和科学研究中&#xff0c;光谱数据的预处理是至关重要的步骤。光谱数据通常包含了丰富的信息&#xff0c;但往往受到噪声、杂散光、背景信号等因素的影响&#xff0c;需要通过预处理来提取有效信号&#xff0c;提高分析的准确性和可靠性。…

用 commitizen-go 来实现标准化你的Git提交信息 【windows 版】

前言 团队中有部分人的 commit 信息比较随意&#xff0c;因此想用工具来进行约束&#xff0c; web 项目可以使用 commitizen 来实现&#xff0c; 但是 golang 又该用什么来约束呢&#xff0c; 在 Github 上找到 commitizen-go 可以做为 commitizen 平替&#xff0c;但该说明文…

为什么共现矩阵是高维稀疏的

为什么共现矩阵是高维稀疏的&#xff1f; 共现矩阵&#xff08;Co-occurrence Matrix&#xff09;的高维稀疏性是其固有特性&#xff0c;主要由以下原因导致&#xff1a; 1. 高维性的根本原因 词汇表大小决定维度&#xff1a; 共现矩阵的维度为 ( V \times V )&#xff0c;其…

OpenLayers 加载鼠标位置控件

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图控件是一些用来与地图进行简单交互的工具&#xff0c;地图库预先封装好&#xff0c;可以供开发者直接使用。OpenLayers具有大部分常用的控件&#x…

知识宇宙-学习篇:学编程为什么从C语言开始学起?

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、C语言的历史地位与影响力1. 编程语言的"鼻祖"2. 现代技术的基础 二、…

手机IP地址更换的影响与操作指南

在移动互联网时代&#xff0c;IP地址如同手机的“网络身份证”&#xff0c;其变更可能对上网体验、隐私安全及服务访问产生连锁反应。无论是为了绕过地域限制、保护隐私&#xff0c;还是解决网络冲突&#xff0c;了解IP更换的影响与正确操作方法都至关重要。本文将系统分析影响…

基于Alibaba Cloud Linux + 宝塔面板安装 LibreOffice 全攻略流程

LibreOffice 是一款功能强大的办公软件,默认使用开放文档格式 (OpenDocument Format , ODF), 并支持 *.docx, *.xlsx, *.pptx 等其他格式。 官网:https://www.libreoffice.org/ 或 https://zh-cn.libreoffice.org/ Alibaba Cloud Linux 3(Soaring Falcon) 是阿里云自主研发…

UniApp 微信小程序绑定动态样式 :style 避坑指南

在使用 UniApp 开发跨端应用时&#xff0c;绑定动态样式 :style 是非常常见的操作。然而&#xff0c;很多开发者在编译为 微信小程序 时会遇到一个奇怪的问题&#xff1a; 原本在 H5 中可以正常渲染的样式&#xff0c;在微信小程序中却不生效&#xff01; 让我们通过一个示例来…

WebSocket学习总结

WebSocket 是一种基于TCP的网络通信协议&#xff0c;允许浏览器和服务器之间进行全双工、实时、低延迟的双向数据传输。它突破了传统HTTP协议的限制&#xff08;请求-响应模式&#xff09;&#xff0c;特别适合需要实时通信的场景&#xff08;如聊天、实时数据推送、游戏等&…

【screen-recorder-tts】RPG 游戏字幕语音实时合成,让无声文字游戏变有声

screen-recorder-tts RPG 游戏字幕语音实时合成&#xff0c;让无声文字游戏变有声&#xff01; 欢迎大佬们提 PR&#xff0c;一起完善这个项目&#xff01;&#xff01;&#xff01; Real-time TTS for RPG game subtitles, turning silent text games into audio experienc…

深入解析Spring Boot与Redis的缓存集成实践

深入解析Spring Boot与Redis的缓存集成实践 引言 在现代Web应用中&#xff0c;缓存技术是提升系统性能的重要手段之一。Redis作为一种高性能的内存数据库&#xff0c;广泛应用于缓存场景。本文将详细介绍如何在Spring Boot项目中集成Redis&#xff0c;并探讨其在实际开发中的…

4月报 | SeaTunnel支持TDengine的多表Sink功能

各位热爱 Apache SeaTunnel 的小伙伴们&#xff0c;今年 4 月份月报更新啦&#xff01;这里将记录 SeaTunnel 社区每月的重要更新&#xff0c;欢迎关注&#xff01; 在本月的众多更新中&#xff0c;最令人关注的一项新特性是——TDengine 多表 Sink 功能的支持&#xff08;由 …