面试经典150题 -- 图的广度优先遍历 (总结)

news2024/11/18 10:18:46

总的链接

面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

 909 . 蛇梯棋

链接 : 

. - 力扣(LeetCode)

题意 : 

 直接bfs就好了 , 题意难以理解 : 

class Solution:
    def snakesAndLadders(self, board: List[List[int]]) -> int:
        n = len(board)

        def id2rc(idx: int) -> (int, int):
            r, c = (idx - 1) // n, (idx - 1) % n
            if r % 2 == 1:
                c = n - 1 - c
            return n - 1 - r, c
        
        vis = set()
        q = deque([(1, 0)])
        while q:
            idx, step = q.popleft()
            for i in range(1, 6 + 1):
                idx_nxt = idx + i
                if idx_nxt > n * n:   # 超出边界
                    break
                
                x_nxt, y_nxt = id2rc(idx_nxt)   # 得到下一步的行列
                if board[x_nxt][y_nxt] > 0:   # 存在蛇或梯子
                    idx_nxt = board[x_nxt][y_nxt]
                if idx_nxt == n * n:   # 到达终点
                    return step + 1
                if idx_nxt not in vis:
                    vis.add(idx_nxt)
                    q.append((idx_nxt, step + 1))   # 扩展新状态
        
        return -1

433 .最小基因变化

类似于树中的层序遍历 , 用bfs实现爆搜就行 ;

对于在bank中与当前字符串只差一个字母且之前没有遍历过的字符串 进行下一层的遍历 ;

详细请看代码 : 

class Solution {
public:
    int minMutation(string s , string e , vector<string>& bank) {
        // 层序遍历 (bfs)
        unordered_set<string> st(bank.begin(), bank.end());
        queue<string> que;
        que.push(s);
        unordered_set<string> tag ;
        tag.insert(s);
        int ans = 0;
        while (!que.empty()) {
            int sz = que.size();
            for (int i = 0; i < sz; ++i) {
                string tmp = que.front(); que.pop();
                if (tmp == e) {
                    return ans;
                }
                for (char c : "ACGT") {
                    for (int j = 0; j < tmp.size(); ++j) {
                        string nt = tmp;
                        nt[j] = c;
                        if (st.count(nt) && !tag.count(nt)) {
                            que.push(nt);
                            tag.insert(nt);
                        }
                    }
                }
            }
            ans ++;
        }
        return -1;
    }
};

127 . 单词接龙

详细题解请看 : 

. - 力扣(LeetCode)

这里采用双向bfs进行解决 : 

class Solution {
public:
    string s, e ;
    set<string> st;

    int ladderLength(string bg, string ed, vector<string>& wl) {
        s = bg ; 
        e = ed ;
        // 将所有 word 存入set ,, 如果目标单词不在 set 中 , 说明无解
        for(string w : wl) st.insert(w) ;
        if(!st.count(e)) return 0 ;
        // 进行双向 bfs , 寻找 ans ;
        int ans = bfs() ;
        return ans == -1 ? 0 : ans + 1 ;
    }

    int bfs(){
        queue<string> d1 , d2 ;
        map<string , int> m1 , m2 ;
        // d1 代表从起点 beginWord 开始搜索(正向)
        // d2 代表从结尾 endWord 开始搜索(反向
        
        /*
         * m1 和 m2 分别记录两个方向出现的单词是经过多少次转换而来
         * e.g. 
         * m1 = {"abc":1} 代表 abc 由 beginWord 替换 1 次字符而来
         * m2 = {"xyz":3} 代表 xyz 由 endWord 替换 3 次字符而来
         */
        
         d1.push(s) ;
         m1[s] = 0 ;
         d2.push(e) ;
         m2[e] = 0 ;

         /*
         * 只有两个队列都不空,才有必要继续往下搜索
         * 如果其中一个队列空了,说明从某个方向搜到底都搜不到该方向的目标节点
         * e.g. 
         * 例如,如果 d1 为空了,说明从 beginWord 搜索到底都搜索不到 endWord,反向搜索也没必要进行了
         */
        while(!d1.empty() && !d2.empty()){
            int t = -1 ;
            if(d1.size() <= d2.size()){
                t = update(d1,m1,m2) ;
            }else{
                t = update(d2,m2,m1) ;
            }
            if(t!=-1) return t ;
        }
        return -1 ;
    }
    // update 代表deque中取出一个单词进行扩展
    // cur : 当前方向的距离词典, other : 另一个方向上的距离词典
    int update(queue<string>& que,map<string,int>& cur,map<string,int>& other){
        while(!que.empty()){
            string s = que.front() ; que.pop() ;
            int n = s.size() ;
            // 枚举哪一个字符需要进行替换
            for(int i=0;i<n;i++){
                // 枚举将s[i]替换成那个小写字母
                for(int j=0;j<26;j++){
                    // 替换之后字符串
                    string str = s.substr(0,i) + (char)(j+'a') + s.substr(i+1) ;
                    if(st.find(str)!=st.end()){
                        // 如果该字符串被[当前方向]记录过,跳过即可
                        if(cur.find(str) != cur.end()) continue;
                        // 如果在[另一方向]上出现过, 说明找到了最短路
                        if(other.count(str)){
                            return cur[s] + 1 + other[str] ;
                        }else{
                            // 否则加入que队列
                            que.push(str) ;
                            cur[str] = cur[s] + 1 ;
                        }
                    } 
                }
            }
        }
        return -1 ;
    }

};

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

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

相关文章

虚拟机中安装Win98

文章目录 一、下载Win98二、制作可启动光盘三、VMware中安装Win98四、Qemu中安装Win981. Qemu的安装2. 安装Win98 Win98是微软于1998年发布的16位与32位混合的操作系统&#xff0c;也是一代经典的操作系统&#xff0c;期间出现了不少经典的软件与游戏&#xff0c;还是值得怀念的…

office办公软件太贵了 Microsoft的Word为什么要买 Microsoft365家庭版多少钱 Microsoft365密钥

Microsoft office是一个被广泛使用的办公软件&#xff0c;它包括了 Word、Excel、PowerPoint 等多种常用的应用程序&#xff0c;已成为许多企业、机构和个人必备的工具。 首先&#xff0c;要理解 Microsoft Office 的价格&#xff0c;我们需要考虑到它的功能和市场需求。Micro…

Pycharm使用教程

1.设置字体型号与大小 file->setting->editor->font(字型)&#xff0c;size&#xff08;大小&#xff09; 2.设置背景颜色 file->setting->editor->color scheme->scheme 3.注释/取消注释 ctrl/ 选中需要注释的部分&#xff0c;双击ctrl/ 取消注释则选…

揭秘数据中心幕后:从电力消耗到温度调控的策略

建设并运营数据中心并非简单的连接硬盘、通电和联网就可以&#xff0c;而是涉及复杂的硬件集成、能源管理、散热设计以及适应不断增长的数据处理和存储需求等诸多挑战。随着全球互联网的普及和AI技术的快速发展&#xff0c;数据中心的规模和能耗需求都在急剧增加。尤其是在电力…

Vue.js计算属性:实现数据驱动的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

新雀优化算法NOA求解机器人栅格地图最短路径规划,可以自定义地图(提供MATLAB代码)

一、星雀优化算法 星雀优化算法(Nutcracker optimizer algorithm,NOA)由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模拟星雀的两种行为&#xff0c;即&#xff1a;在夏秋季节收集并储存食物&#xff0c;在春冬季节搜索食物的存储位置。CEC2005:星雀优化算法(Nut…

判断链表回文

题目&#xff1a; //方法一&#xff0c;空间复杂度O(n) class Solution { public:bool isPalindrome(ListNode* head) {vector<int> nums; //放进数组后用双指针判断ListNode* cur head;while(cur){nums.emplace_back(cur->val);cur cur->next;}for(int i0…

Spring MVC 全局异常处理器

如果不加以异常处理&#xff0c;错误信息肯定会抛在浏览器页面上&#xff0c;这样很不友好&#xff0c;所以必须进行异常处理。 1.异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出&#xff0c;最后由springmvc前端控制器交由异常处理器进行异…

【玩转Linux】有关Linux权限

目录 一.Linux权限的概念 1. 权限的本质 2.Linux中的用户 3.Linux中的权限管理 (1)文件访问者的分类 (2)文件类型和访问权限&#xff08;事物属性&#xff09; ①文件基本权限 ②文件权限值的表示方法 (3)文件访问权限的相关设置方法 ① 用 户 表 示 符 / - 权 …

BIM技术趋势

随着 2024 年的到来&#xff0c;3D 建模和人工智能 (AI) 的集成将重新定义建筑信息模型 (BIM) 的格局。 人工智能驱动的解决方案将为设施管理、照明设计、工程和建筑等 BIM 相关领域树立新标准。 本文重点介绍 3D 建模和人工智能的这些趋势如何比更传统的方法提供竞争优势。 它…

Python 一步一步教你用pyglet制作汉诺塔游戏

目录 汉诺塔游戏 1. 抓取颜色 2. 绘制圆盘 3. 九层汉塔 4. 绘制塔架 5. 叠加圆盘 6. 游戏框架 汉诺塔游戏 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;是一个源于印度古老传说的益智玩具。这个传说讲述了大梵天创造世界的时候&#xff0c;他做了三根金刚…

【深度学习笔记】7_2 梯度下降和随机梯度下降

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 7.2 梯度下降和随机梯度下降 在本节中&#xff0c;我们将介绍梯度下降&#xff08;gradient descent&#xff09;的工作原理。虽然梯度…

Vue 监听器:让你的应用实时响应变化

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Kibana二次开发环境搭建

1 kibana环境搭建 1.1 搭建后端服务 &#xff08;1&#xff09;java环境安装 ElasticSearch运行需要java jdk支持。所以要先安装JAVA环境。由于ElasticSearch 5.x 往后依赖于JDK 1.8的&#xff0c;所以现在我们下载JDK 1.8或者更高版本。下载JDK1.8,下载完成后安装&#xff…

计算机设计大赛 疲劳驾驶检测系统 python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#x…

ai+模型选择+过拟合和欠拟合

ai模型选择过拟合和欠拟合 1模型选择1训练误差和泛化误差2验证数据集和测试数据集3k-折交叉验证4总结 2过拟合和欠拟合1模型容量2估计模型容量3VC维4数据复杂度5总结 3代码 1模型选择 1训练误差和泛化误差 训练误差&#xff08;Training Error&#xff09;和泛化误差&#xff…

STM32(19)I2C模块 主机发数据

发送数据&#xff1a; 等待空闲&#xff1a; 发送起始位&#xff1a; 发送地址&#xff1a; 发送数据&#xff1a;

day16_购物车(添加购物车,购物车列表查询,删除购物车商品,更新选中商品状态,完成购物车商品的全选,清空购物车)

文章目录 购物车模块1 需求说明2 环境搭建3 添加购物车3.1 需求说明3.2 远程调用接口开发3.2.1 ProductController3.2.2 ProductService 3.3 openFeign接口定义3.3.1 环境搭建3.3.2 接口定义3.3.3 降级类定义 3.4 业务后端接口开发3.4.1 添加依赖3.4.2 修改启动类3.4.3 CartInf…

Docker:部署微服务集群

1. 部署微服务集群 实现思路&#xff1a; ① 查看课前资料提供的cloud-demo文件夹&#xff0c;里面已经编写好了docker-compose文件 ② 修改自己的cloud-demo项目&#xff0c;将数据库、nacos地址都命名为docker-compose中的服务名 ③ 使用maven打包工具&#xff0c;将项目…

linux信号的概念

目录 1.预备 2.信号如何产生 1.引入 2.原理 3.总结 3.接口 1.singal函数 2.kill函数 3.raise函数&#xff08;给自己发信号&#xff09; 4.abort函数&#xff08;给自己发送6号信号&#xff09; 4.异常 1.现象 2.原理 5.core和term区别 6.由软件条件产生信号 3.…