代码随想录额外题目——图论部分

news2025/2/24 6:28:28

记录一下代码随想录中额外题目的图论部分

841.钥匙和房间

有 n 个房间,房间按从 0 到 n - 1 编号。最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。

当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。

给你一个数组 rooms 其中 rooms[i] 是你进入 i 号房间可以获得的钥匙集合。如果能进入 所有 房间返回 true,否则返回 false。

示例 1:

输入:rooms = [[1],[2],[3],[]]
输出:true
解释:
我们从 0 号房间开始,拿到钥匙 1。
之后我们去 1 号房间,拿到钥匙 2。
然后我们去 2 号房间,拿到钥匙 3。
最后我们去了 3 号房间。
由于我们能够进入每个房间,我们返回 true。
示例 2:

输入:rooms = [[1,3],[3,0,1],[2],[0]]
输出:false
解释:我们不能进入 2 号房间。

思路:

1.初次接触图论相关,自己一开始是完全没有思路的。在看到代码随想录里的讲解原图再联想到当初刚学数据结构与算法时在PPT中看到的图,突然间就想起了当初老师讲解图时也是教的DFS和BFS两种遍历方式,不过平时因为几乎没有接触过图所以已经忘掉了相关的思路方法;不过好在之前已经做过了回溯与二叉树相关章节,对于本题的思路基础还是有很大帮助。

2.如果在草稿纸或者在脑海中构思一下本题中的图,以每一个房间为一个结点,每一个房间中拥有的钥匙作为连接结点之间的单向箭头,可以发现在示例2中的房间2是被孤立的结点,没有其他房间能够指向它,所以我们相当于找到了一种满足的条件,即如果出现被孤立的结点那么一定返回false

3.但实际上排除上述情况之后还有一种情况,以下引用代码随想录中的讲解原图

由此图我们可以发现,没有孤立的结点,但是房间5作为中转站,不能使房间0去往房间1、2、3,也不能使得房间1、2、3去往房间0,因此这种情况也是不满足题意的。

4.综合以上思路后,我们选择采取深度优先遍历来解决本题,套用二叉树和回溯算法中相关的模板即可写出如下代码:

class Solution {
public:
    void dfs(vector<vector<int>>& rooms, int key, vector<bool>& visited){
        //如果当前房屋已访问则返回
        if(visited[key]) return;

        //如果当前房屋之前未访问,如今访问到后将其设为true,并获得该房间的所有钥匙
        visited[key] = true;
        vector<int> keys = rooms[key];
        for(int key : keys){
            dfs(rooms, key, visited);
        }
    }

    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        vector<bool> visited(rooms.size(), false);
        dfs(rooms, 0, visited);

        for(int i = 0; i < visited.size(); i++){
            if(visited[i] == false) return false;
        }

        return true;
    }
};

 启发:

1.本题第一点不容易想明白的地方在于递归的终止条件,到底是处理当前结点时终止还是处理下一个结点时终止?其实都可,只不过不同的思路不同的写法罢了,不过自己因为更习惯于前者。

2.关于图,建议还是在草稿纸上把情况画出来,这样能够更直观地看出问题所在,也方便我们转化问题。

127.单词接龙

字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk:

每一对相邻的单词只差一个字母。
 对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
sk == endWord
给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。

 
示例 1:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
输出:5
解释:一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。
示例 2:

输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
输出:0
解释:endWord "cog" 不在字典中,所以无法进行转换。

思路:

1.本题难度瞬间就上了一个档次。在草稿纸上把大致的图画出来后发现我们要解决的问题主要在于:(1)如何连接图中的两个点,即连线的建立条件是什么;(2)如何找到最短的转换序列。

2.针对问题一,可以发现建立连线的条件是两个字符串之间只有一个字符不同。这一点看上去挺简单,但要在代码中实现还是有一定难度。首先我们需要判定当前字符串是否已经被访问过,因此我们需要一个哈希表来存储当前字符串,又因为我们最后要求最短路径长度,因此采用unordered_map,通过键值对的方式来进行存储,其中键代表字符串,值代表从beginWord到达该字符串的路径长度。

3.针对问题二,实质上就是本题选择的遍历方式。我们纵观DFS和BFS两种方式不难发现,DFS倾向于一条路走到底,走不通后再折返(回溯),适合遍历所有的路径;而BFS是到达一个结点就优先遍历其连接的结点,倾向于找到一种满足条件的情况,因此我们选择采取BFS来解决该题。

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> wordSet(wordList.begin(), wordList.end());//转化为哈希表方便查询
        //如果字符集中没找到endWord,直接返回0
        if(wordSet.find(endWord) == wordSet.end()) return 0;

        unordered_map<string, int> visitMap;//存储字符串及到达该字符串的路径长度的哈希表

        queue<string> que;
        que.push(beginWord);
        visitMap.insert(pair<string, int>(beginWord, 1));

        //开始广度遍历
        while(!que.empty()){
            string word = que.front();
            que.pop();
            int path = visitMap[word];//记录当前路径的长度
            for(int i = 0; i < word.size(); i++){
                //用一个临时变量来代表改变单个字符后的新字符串,随后开始挨个替换当前字符串中的单个字符
                string newWord = word;
                for(int j = 0; j < 26; j++){
                    newWord[i] = j + 'a';
                    //如果新字符串恰好就是endWord,返回当前路径长度+1
                    if(newWord == endWord) return path + 1;
                    //如果当前字符串出现在了原字符集中,并且仍未访问过该字符串,那么将其记录进入哈希表中
                    if(wordSet.find(newWord) != wordSet.end() && visitMap.find(newWord) == visitMap.end()){
                        visitMap.insert(pair<string, int>(newWord, path + 1));
                        que.push(newWord);
                    }
                }
            }
        }

        //如果遍历完都没找到,那么就返回0
        return 0;
    }
};

启发:

1.本题的细节性问题实际上还是很多的,如一开始就将题目所给的wordList用unordered_set转化,方便我们后续进行查询(因为字符串相当于还是数组,用数组查询就必然要用到遍历,代码会更加冗杂)。

2.其次,在实际进行广度遍历的代码中,我们并不是遍历原字符串数组中的每一个字符串并与当前字符串挨个比较字符,满足只有一个字符不同的情况下才将其加入队列和记录进入哈希表中,这种情况光是口述就可以想象得出极其复杂。

我们选择的是换一种思路,直接用一个临时变量复制当前字符串,然后依次遍历临时变量中的每个字符并且用所有小写字母替换一遍单个字符,如果当前字符替换后的新字符能够在集合中找到,并且在哈希表中没有存储过(即没有到达过),那么我们就将该新字符加入队列并且记录进入哈希表。这种想法非常巧妙,避免了我们实际去遍历比较每个字符串在单个字符不同的情况下还要在原字符集里面。

3.本题虽然理论上来说DFS也能做,但DFS会比较复杂,而BFS正契合本题的情况,因为BFS一旦找到当前结点就一定是最短长度

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

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

相关文章

山海大模型亮相,云知声交出AGI第一份答卷

有人说&#xff0c;AI大模型是少数巨头才能玩得转的游戏。 截至目前&#xff0c;认同此观点的人不在少数。自从ChatGPT去年迅速火遍全球之后&#xff0c;忽如一夜春风来&#xff0c;AI大模型遍地开。Google、Amazon、阿里、百度等巨头们纷纷加入AI大模型的“军备竞赛”&#x…

【数据分享】1929-2022年全球站点的逐日平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…

大数据分析案例-基于决策树算法构建世界杯比赛预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

EMC VNX Unified Storage 关机顺序方法

EMC Unfied的VNX存储系统要比单纯的Block系统复杂很多&#xff0c;相当于是两套存储系统&#xff0c;不管在物理硬件上还是逻辑的软件OS上&#xff0c;都复杂很多很多。 客户经常遇到由于机房停电或者机房搬迁等情况&#xff0c;需要对存储系统做关机下电甚至物理搬迁的动作&a…

FPGA基于AXI 1G/2.5G Ethernet Subsystem实现UDP通信DMA传输 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案传统UDP网络通信方案本方案详细设计说明DMA和BRAMAXIS-FIFOUDP模块设计UDP模块FIFOAXI 1G/2.5G Ethernet Subsystem&#xff1a;输出 4、vivado工程详解5、上板调试验证并演示注意事项 6、福利&#xff1a;工程代码的获取 1、…

【simple-cache】一款只用一个注解就实现缓存的框架-我们终于迎来了SpringBoot版本

上次我们讲了【simple-cache】的使用&#xff1a; 【simple-cache】我开发了一款只要一个注解就可以轻松实现缓存的框架 这次主要更新的内容为&#xff1a; 添加springboot项目框架中去除了redisconfig类&#xff0c;避免了redis的单机和集群问题用户可以自定义使用自己项目中…

Python之字符串(str)基础知识点

strip() 删除指定字符 当token为空时,默认删除空白符(含’\n’,‘\r’,‘\t’,’ )&#xff0c;当非空时&#xff0c;根据指定的token进行删除。 字符的删除又可分为以下几种情况&#xff1a; string.strip(token)&#xff1a;删除string字符串中开头(left)、结尾处(right)的…

【操作系统】02.进程管理

多道程序系统 多道就是将多个程序同时装入内存&#xff0c;使之并发运行。操作系统也是基于多道产生的&#xff0c;提高了资源利用率和系统吞吐量。 进程 定义 进程是程序的一次执行 进程是进程实体的运行过程&#xff0c;是系统进行资源分配和调度的一个独立单位 在引入线…

会流程图却不会UML活动图?活动图深度剖析,就怕你学不会!

1. UML活动图是啥&#xff1f; 也许很多人都不怎么了解活动图&#xff0c;但是却对流程图很熟悉&#xff0c;你暂且可以简单的把活动图理解为UML里的流程图&#xff0c;用来描述系统的行为特征。不过UML活动图对比于流程图来说也存在不少差异&#xff0c;本文将在第三章节讲解活…

解决 MobaXterm X11 server 打开 wsl2 linux 子系统 rviz 可视化窗口卡顿问题

1、问题 环境&#xff1a; MobaXtermwsl2 Ubuntu-18.04ROS1Intel 核显 一直使用 MobaXterm 这个远程软件 ssh 链接 linux 服务器&#xff0c;因为它集成了 X11 server&#xff0c;即可以显示一些 linux 下有图形化界面的程序&#xff0c;如 ROS 的 rviz 等。 但是 MobaXterm…

宝塔面板一键部署Z-Blog博客 - 内网穿透实现公网访问

文章目录 1.前言2.网站搭建2.1. 网页下载和安装2.2.网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测试5.结语 转发自cpolar极点云的…

一步一步的实现使用 Tensorflow Hub 进行图像分割

在本文中&#xff0c;我们将学习如何使用 TensorFlow Hub中提供的预训练模型执行语义图像分割。TensorFlow Hub 是一个库和平台&#xff0c;旨在共享、发现和重用预训练的机器学习模型。TensorFlow Hub 的主要目标是简化重用现有模型的过程&#xff0c;从而促进协作、减少冗余工…

[比赛简介]ICR - Identifying Age-Related Conditions

比赛链接&#xff1a;https://www.kaggle.com/competitions/icr-identify-age-related-conditions 比赛简介 本次比赛的目标是预测一个人是否患有三种疾病中的任何一种。您被要求预测该人是否患有三种疾病中的任何一种或多种&#xff08;1 类&#xff09;&#xff0c;或者三种…

第14届蓝桥杯Scratch选拔赛(STEMA) 真题集锦

一、选择题 第 1题单选题 运行以下程序 (小象仅有两个造型),小象的造型是哪个? () 答案 A 解析 本题正确答案是A,考察的知识点是角色造型,在Scratch中,切换造型有两个指令,分别是“换成xx造型“和“下一个造型”,其中前者将角色切换为指定造型,而后者则从当前造型切换…

面向小白的最全Python数据分析指南,超全的!

因工作需求经常会面试一些数据分析师&#xff0c;一些 coding 能力很强的小伙伴&#xff0c;当被问及数据分析方法论时一脸懵逼的&#xff0c;或者理所当然的认为就是写代码啊&#xff0c;在文章开头先来解释一下数据分析。 数据分析是通过明确分析目的&#xff0c;梳理并确定…

虎牙在全球 DNS 秒级生效上的实践

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

六级备考18天|CET-6|写作第一讲|现象解释|10:00~10:45

目录 1. 议论文类型 现象解释 what,why,importance 观点选择 whether,choice,option 问题解决 how to,measures 图片图表 image,cartoon,diagram,chart 2. 基本题型 议论文、图表、谚语 3. 模版构成/段落结构划分 三个段落&#xff1a;10-11句 背景主题句过渡句 …

电加热道岔融雪系统设备

设备构成 融雪设备由道岔融雪远程控制中心工作站(以下简称工作站)、道岔融雪车站控制终端(以下简称控制终端)、道岔融雪控制柜(以下简称控制柜)、钢轨温度传感器、电加热元件、道岔融雪隔离变压器(以下简称隔离变压器)等组成。 01集中供电方式 02分散供电方式 设备型号及含义…

本地新建项目,git 到gitlab中

目录 1、首先&#xff0c;gitlab中&#xff0c;创建一个空项目 2. 本地项目上 操作 1&#xff09; git init 2) 关联远程仓库 3&#xff09;git pull 4) 查看远程分支 5&#xff09;指定git pull 远程哪个分支 6&#xff09;关联远程分支 7&#xff09; .gitignore …

批量处理同列的相同值,合并成一个单元格

效果 易错点 选中公司部门的时候,选择是数据的开始的第一行和最后一行居中和合并完后,选择的也是公司部门的数据开始第一行和最后一行; 操作方法 1、 鼠标悬浮到你要合并的任意一栏 2、 选择菜单-数据汇总 3. 这两个值&#xff0c;要选择要分组的列名&#xff0c;求和方式…