BFS算法套路框架
一、概念
1、定义
Broad First Search
2、与DFS区别
BFS找到的路径最短
3、本质
找出图中从起点到终点的最近距离
二、二叉树的最小高度111
1、代码
/**
* 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 {
public int minDepth(TreeNode root) {
if(root == null) return 0;
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
int depth = 1;
while(!q.isEmpty()){
int sz = q.size();
for(int i = 0; i < sz; i++){
TreeNode node = q.poll();
if(node.left == null && node.right == null)
return depth;
//将邻接点加入队列
if(node.left != null)
q.offer(node.left);
if(node.right != null)
q.offer(node.right);
}
depth++;
}
return depth;
}
}
2、比较
DFS靠递归的堆栈,BFS借助队列齐头并进
BFS可以在没遍历完整棵树时就得到最短距离,而回溯法必须遍历完整棵树才行
DFS空间复杂度log级(堆的深度=树高),BFS空间复杂度N
一般在寻找最短路径时用BFS,否则用DFS更多一些。
三、打开转盘锁752
class Solution {
String plusOne(String s, int i){
char[] str = s.toCharArray();
if(str[i] == '9'){
str[i] = '0';
}else{
//str[i] = (char)str[i] + 1;
str[i] += 1;
}
return new String(str);
}
String minusOne(String s, int i){
char[] str = s.toCharArray();
if(str[i] == '0'){
str[i] = '9';
}else{
str[i] -= 1;
}
return new String(str);
}
public int openLock(String[] deadends, String target) {
Set<String> deads = new HashSet<>();
for(String deadend : deadends) deads.add(deadend);
Set<String> visited = new HashSet<>();
Queue<String> q = new LinkedList<>();//双向BFS不需要栈,而是set即可
int step = 0;
q.offer("0000");
visited.add("0000");
while(!q.isEmpty()){
//如果是双向不需要出队,直接foreach遍历邻接节点
int sz = q.size();
for(int i = 0; i < sz; i++){
String cur = q.poll();//出队后的不再入队
//判断是否是终点
if(deads.contains(cur)){
continue;
}
if(cur.equals(target)){
return step;
} for(int j = 0; j < 4; j++){
String up = plusOne(cur,j);
if(!visited.contains(up)){
visited.add(up);
q.offer(up);
}
String minus = minusOne(cur,j);
if(!visited.contains(minus)){
visited.add(minus);
q.offer(minus);
}
}
}
step++;
}
return -1;
}
}
可以使用双向BFS优化,循环开始选择小的分支进行轮转
BFS算法套路框架的更多相关文章
- 4、BFS算法套路框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
- 3、回溯算法解题套路框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
- 2、动态规划接替套路框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
- 【ToolGood.Words】之【StringSearch】字符串搜索——基于BFS算法
字符串搜索中,BFS算法很巧妙,个人认为BFS算法效率是最高的. [StringSearch]就是根据BFS算法并优化. 使用方法: string s = "中国|国人|zg人|fuck|a ...
- BFS算法(——模板习题与总结)
首先需要说明的是BFS算法(广度优先算法)本质上也是枚举思想的一种体现,本身效率不是很高,当数据规模很小的时候还是可以一试的.其次很多人可能有这样的疑问,使用搜索算法的时候,到底选用DFS还是BFS, ...
- 广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...
- dfs和bfs算法
1. 存储图的方式一般是有两种的:邻接表和邻接矩阵,一般存储链接矩阵的方式是比较简单的,也便于我们去实现这个临接矩阵,他也就是通俗的二维数组,我们平常用到的那种. 2. 这里我们主要记录和讲一下bfs ...
- POJ 3126 Prime Path(BFS算法)
思路:宽度优先搜索(BFS算法) #include<iostream> #include<stdio.h> #include<cmath> #include< ...
- Day1 BFS算法的学习和训练
因为自己的原因,之前没有坚持做算法的相应学习,总是觉得太难就半途而废,真的算是一个遗憾了,所以现在开始,定一个30天入门学习算法计划. 我是根据<算法图解>的顺序进行安排的,自己对 ...
- BFS算法的优化 双向宽度优先搜索
双向宽度优先搜索 (Bidirectional BFS) 算法适用于如下的场景: 无向图 所有边的长度都为 1 或者长度都一样 同时给出了起点和终点 以上 3 个条件都满足的时候,可以使用双向宽度优先 ...
随机推荐
- mysql8.0.25版本设置主从数据库,并且从库只读
具体操作步骤 说明:主从数据库版本一致 1.主库创建同步使用的用户 create user 'repl'@'%' identified with 'mysql_native_password' by ...
- vue-router query和params 传参和接收参数
1.params 方式传递和接收参数 //传参 this.$router.push({ name: 'checkDetailInfo', params:{ fkdNum:fkdNum, jyayStr ...
- Docker | Compose创建mysql容器
本文通过Docker Compose来创建mysql容器 在linux服务器上创建文件,用于管理容器 mkdir docker-mysql cd docker-mysql vim docker-com ...
- JSP的内置对象 request和response
文章目录 1.request对象 2.response响应对象 3.out输出对象 4.session会话对象 5.application应用对象 概述 在使用JSP内置对象的时候.不需要先定义这些对 ...
- 13-ORM-更新&删除
一.更改单个数据 修改单个实体的某些字段 1.查: - 通过get()得到要修改的实体对象 2.改: - 通过对象属性的=的方式修改数据 3.保存 - 通过对象.save()保存数据 二.批量 ...
- 二、python基本数据类型
一. 字面量 代码中,被写在代码中的固定的值,称之为字面量 Python常用6种值(数据)类型 字符串(string) :又称文本,是由任意数量的字符如中文.英文.各类符号.数字等组成.所以叫做字符的 ...
- 【MySQL】Navicat15 安装
# Navicat安装` 提示`:鉴于之间已经出了MySQL的安装教程,在这了我也讲下,那个其实包含了两个知识点,既可以小白初次安装MySQL客户端,也面向想安装5.x和8.x两个版本的. --- @ ...
- C#中的特性+反射
反射 反射指程序可以访问.检测和修改它本身状态或行为的一种能力. 程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象. 您可以使用反射动态地创建类型的实例,将类型 ...
- Spring知识框架
- 七、docker镜像私有仓库
在Docker中,当我们执行 docker pull xxx 的时候 ,它实际上是从 hub.docker.com 这个地址去查找,这就是 Docker 公司为我们提供的公共仓库.在工作中,我们不可能 ...