刷题日记08《BFS》

news2024/11/24 14:59:53

概念

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

模板

// 计算从起点 start 到终点 target 的最近距离
int BFS(Node start, Node target) {
    Queue<Node> q; // 核心数据结构
    Set<Node> visited; // 避免走回头路
    
    q.offer(start); // 将起点加入队列
    visited.add(start);

    while (q not empty) {
        int sz = q.size();
        /* 将当前队列中的所有节点向四周扩散 */
        for (int i = 0; i < sz; i++) {
            Node cur = q.poll();
            /* 划重点:这里判断是否到达终点 */
            if (cur is target)
                return step;
            /* 将 cur 的相邻节点加入队列 */
            for (Node x : cur.adj()) {
                if (x not in visited) {
                    q.offer(x);
                    visited.add(x);
                }
            }
        }
    }
    // 如果走到这里,说明在图中没有找到目标节点
}

范式题目

题目

力扣icon-default.png?t=N6B9https://leetcode.cn/problems/open-the-lock/

你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' 。每个拨轮可以自由旋转:例如把 '9' 变为 '0','0' 变为 '9' 。每次旋转都只能旋转一个拨轮的一位数字。

锁的初始数字为 '0000' ,一个代表四个拨轮的数字的字符串。

列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。

字符串 target 代表可以解锁的数字,你需要给出解锁需要的最小旋转次数,如果无论如何不能解锁,返回 -1 。

示例 1:

输入:deadends = ["0201","0101","0102","1212","2002"], target = "0202"
输出:6
解释:
可能的移动序列为 "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"。
注意 "0000" -> "0001" -> "0002" -> "0102" -> "0202" 这样的序列是不能解锁的,
因为当拨动到 "0102" 时这个锁就会被锁定。
示例 2:

输入: deadends = ["8888"], target = "0009"
输出:1
解释:把最后一位反向旋转一次即可 "0000" -> "0009"。
示例 3:

输入: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"
输出:-1
解释:无法旋转到目标数字且不被锁定。

 

提示:

1 <= deadends.length <= 500
deadends[i].length == 4
target.length == 4
target 不在 deadends 之中
target 和 deadends[i] 仅由若干位数字组成

解题思路

对于每一个在元素队列中的元素,我们要对其每一位进行+1和-1操作,使新生成的每一个数字在判断此前没有加入过队列之后将其加入元素队列,对每一个加入元素队列的数字判断是否在禁止数字队列中,在则continue这个元素,不在则判断这个元素是否为最终结果,不为最终结果则利用这个元素进行+1和 -1的操作,在此过程中利用计数器来计算次数,最终如果cur为找到的元素,返回计数器,否则返回-1(注意的是:我们每次往队列中加入元素都是刚开始只需要判断该元素是否访问过,当cur指向该元素时,再去判断是否在deads中(避免重复判断导致的超时))

实例代码

class Solution {
    public int openLock(String[] deadends, String target) {
        int res=0;//定义计数器
        //定义两个队列
        HashSet<String>visited=new HashSet<>();
        HashSet<String>deads=new HashSet<>();
        LinkedList<String>elements=new LinkedList<>();
        //求+1和-1
        //加入队列
        for(String s:deadends){
            deads.add(s);
        }
        if(deads.contains("0000")){
            return -1;
        }
        elements.offer("0000");
        visited.add("00000");
        while(elements.size()!=0){
            int n=elements.size();
        for(int i=0;i<n;++i){
            String cur=elements.remove();
            if(cur.equals(target)){
                return res;
            }
            //加入观察过的队列
            visited.add(cur);
          for(int j=0;j<4;++j){
                String sub=oneSub(cur,j);
            String plus=onePlus(cur,j);
             if(!visited.contains(sub)&&!deads.contains(sub)){
                 //添加元素
                 elements.offer(sub);
             }
              if(!visited.contains(plus)&&!deads.contains(plus)){
                 //添加元素
                 elements.offer(plus);
             }
          } 
        }
        res++;
        }
        return -1;          
    }
    public String onePlus(String cur,int j){
        char []chars=cur.toCharArray();
        char ch=chars[j];
        if(ch=='9'){
            chars[j]='0';
        }else{
            chars[j]+=1;
        } 
        return new String(chars);  
    }
    public String oneSub(String cur,int j){
        char []chars=cur.toCharArray();
        char ch=chars[j];
        if(ch=='0'){
            chars[j]='9';
        }else{
            chars[j]-=1;
        } 
        return new String(chars);   
    }

}

题目

力扣icon-default.png?t=N6B9https://leetcode.cn/problems/minimum-depth-of-binary-tree/

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:


输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

 

提示:

树中节点数的范围在 [0, 105] 内
-1000 <= Node.val <= 1000
通过次数574,422提交次数1,099,570

解题思路

利用队列存储树中访问的元素,不断调用对列中的元素,直到某个元素的左右子树全部为空(在过程中使用计数器进行计数,直到叶子结点)

实例代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //定义计数器
    int count=0;
    //定义数据保存队列
    private LinkedList<TreeNode>data=new LinkedList<>();
    public int minDepth(TreeNode root) {
        if(root==null){
            return 0;
        }
        //将根结点加入队列
        data.add(root);
        bfs();
        return count;
    }
    public void bfs(){
        //while循环遍历深度,for循环遍历同一层
        while(data.size()!=0){
            count++;
            int n=data.size();
            for(int i=0;i<n;++i){
                TreeNode node=data.remove();
                if(node.left==null&&node.right==null){
                    return;
                }
                
                    if(node.left!=null){
                        data.add(node.left);
                    }
                    if(node.right!=null){
                        data.add(node.right);
                    }
                
            }
        }
    }
}

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

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

相关文章

易语言后,极语言成为官方支持语言,新中文编程语言开始革新而来

易语言促进了中文编程普及和发展 众所周知&#xff0c;吴涛先生在1997年创建的易语言称得上是中文编程的鼻祖。 易语言之后&#xff0c;很多中文编程语言接踵而至&#xff1a;甲语言、乙语言、丙语言、甲骨文编程语言、梅花编程语言等等。 为中国的软件开发者提供了更加便捷和…

什么是aPaaS?aPaaS和低代码是一回事吗?

低代码和aPaaS是近年最为火热的技术趋势之一&#xff0c;那么低代码aPaaS吗&#xff1f;两者有什么关系&#xff1f;今天小帆为大家介绍它们的前世今生。 在介绍低代码和aPaaS前&#xff0c;先要明确一个概念——云服务。云服务是基于互联网的相关服务的增加、使用和交互模式&a…

Profibus-DP转modbus RTU网关profibus主站的实现方案有哪些

远创智控YC-DPM-RTU网关在Profibus总线侧实现主站功能&#xff0c;在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备&#xff08;如&#xff1a;EH流量计、倍福编码器等&#xff09;接入到Modbus网络中&#xff1b;通过增加DP/PA耦合器&#xff0c;也可将Profibus PA从站…

如何获取microstore商品详情接口php接口jason数据字段

随着科技的发展&#xff0c;API接口成为了各行业发展的最新趋势。在微店购物平台中&#xff0c;商品详情API接口的引入&#xff0c;为商家和消费者提供了更加便捷、高效的用户体验。本文将为大家详细介绍微店商品详情API接口的优势和使用方法 商品详情API接口的优势 1.提升用户…

那些隐藏在项目中的kotlin小知识,在座各位...

写kotlin越来越久&#xff0c;很多代码虽然能看懂&#xff0c;并且能去改&#xff0c;但是不知道他用了啥&#xff0c;里面的原理是什么&#xff0c;举个例子&#xff1f;大家一起学习一下吧 内联函数 顾名思义&#xff0c;但是在项目中我遇到得很少&#xff0c;他比较适用于一…

基于互联网下的智能配电网运维

安科瑞 华楠 摘要&#xff1a;在“互联网 ”背景下实现互联网技术和智能配电网的融合成为一种必然趋势&#xff0c;本文主要针对基于“互联网 ”的智能配电网运维技术进行分析&#xff0c;在分析我国目前智能电网运维困境和现状的基础上&#xff0c;构建基于“互联网 ”的智能配…

【域名解析】 【二级域名分发】 【vue3部署】 【腾讯云cos】 【DNSPOD】

首先注册腾讯云账号登录 先在腾讯云域名系统中购买域名并且在工信部备案 我的域名 - DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS 然后点击 DNSPOD DNS 解析 - 定价中心 - 腾讯云 DNSPod - 国民级 DNS 服务平台_智能DNS_免费_域名_解析_VIP_套餐 自行选择免费版…

【UE4 塔防游戏系列】09-防御塔升级、击杀敌人增加金钱

目录 效果 步骤 一、控件蓝图文本控件内容绑定金钱数 二、防御塔改造 三、击杀敌人增加金钱 四、防御塔升级功能 效果 步骤 一、控件蓝图文本控件内容绑定金钱数 1. 打开“TaFangGameMode”&#xff0c;新增一个变量命名为“PlayerMoney”&#xff0c;默认值设为2…

dp算法 力扣152乘积最大子数组

本文是Java代码&#xff01;&#xff01; 152. 乘积最大子数组 - 力扣&#xff08;LeetCode&#xff09; 一、题目详情 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该…

【C++】STL栈和队列基本功能介绍、题目练习和模拟实现(容器适配器)

stack && queue 基本功能介绍、练习和模拟实现 前言正式开始基本函数功能三道经典栈题目讲解最小栈栈的弹出压入顺序逆波兰表达式求值 模拟实现stackqueue deque 前言 本篇基本功能不会介绍太多&#xff0c;主要是说一下STL库中的接口&#xff0c;还是在这个网站上的&…

【动态内存错误详解和C的内存分区】

常见的动态内存错误 1.动态内存错误2.经典案例分析2.1案例一2.1.1**问题分析**2.1.2**修改错误** 2.2案例二2.2.1 原因分析2.2.2 解决问题 c/c内存分布1.2 内存分区简介1.2.1 栈区(stack)1.2.2 堆区(heap)1.2.3 全局(静态)区1.2.4 常量区1.2.5 代码区 1.动态内存错误 &#xf…

DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程

目标检测系列的算法模型可以说是五花八门&#xff0c;不同的系列有不同的理论依据&#xff0c;DETR的亮点在于它是完全端到端的第一个目标检测模型&#xff0c;DETR&#xff08;Detection Transformer&#xff09;是一种基于Transformer的目标检测模型&#xff0c;由Facebook A…

幼儿园门禁安全升级,其实是这么做的!

幼儿园门禁安全是确保幼儿园校园安全的重要方面。为了有效管理出入人员和防止未经授权者进入&#xff0c;幼儿园门禁系统起到了至关重要的作用。 人脸识别门禁系统作为一种先进的技术方案&#xff0c;通过准确识别个体的面部特征&#xff0c;提供了更高的安全性和便捷性。 客户…

HeidiSQL使用

​ 1、点击新建后&#xff0c;选择在根分类创建会话 2、左侧在会话名称下出现的Unnamed&#xff0c;右键选择Rename即可重命名。右侧选择数据库类型&#xff08;mysql&#xff09;&#xff0c;输入主机名&#xff08;默认本机127.0.0.1&#xff09;&#xff0c;用户名&#xff…

webpack打包之 copy-webpack-plugin

copy-webpack-plugin 打包复制文件插件。 1、什么时候要使用&#xff1f; 在离线应用中&#xff0c;前端所有文件都需在在本地&#xff0c;有些文件&#xff08;比如iconFont以及一些静态img)需要转为离线文件&#xff0c;这些文件可以直接引用更方便些&#xff0c;这就需要在打…

0基础小白自学Java“基础语法合集”,新手看这一篇就够了!!

零基础开始学习Java&#xff0c;我们应该如何入手呢&#xff1f;本文将分享以下的6点以帮助朋友们更好的学习。 1、Java注释&#xff1a; 注释是什么&#xff0c;我们为什么要学习注释&#xff1f;注释的分类?注释使用的注意事项? 注释前后对比 注释概念&#xff1a; 注释…

Python基础合集 练习28 (数值运算函数)

from this import d x -120 x的绝对值 x1 abs(x) 同时输出商和余数 y 7 y1 divmod(x1, y) print(y1) /进行幂余运算 z可以省略 (x**y)%z pow(x,y[,z]) pow(3, pow(3, 99), 10000) 四舍五入函数 d是保留小数位数&#xff0c;默认为0 round(x,[,d]) print(round…

什么是JSON

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <script>//编写一个JavaScript对象var obj{name:"蒋铭基",id:3,age:19}//将对象转化…

bclinux执行df命令无反应解决方法、bclinux执行df命令卡死解决方法、进程追踪strace命令说明

文章目录 说明解决方法首先排除不是系统问题验证挂载信息追踪df进程strace命令安装strace命令定位df命令卡在哪解决卡住的进程问题解决&#xff0c;验证 说明 额 今天收到反馈&#xff0c;虚拟机执行df命令卡住 卡住状态如下图 解决方法 首先排除不是系统问题 很简单&…

Ceph分布式文件系统——文件系统MDS接口 块存储RDB接口 对象存储RGW接口

创建 CephFS 文件系统 MDS 接口 服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node01 node02 node03 2&#xff09;查看各个节点的 mds 服务 ssh rootnode01 systemctl status ceph-mdsnode01 ssh rootnode02 systemctl status ceph…