【算法-面试】广度优先遍历bfs专题

2024-05-23 22:58

本文主要是介绍【算法-面试】广度优先遍历bfs专题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. BFS

  • 111 二叉树的最小深度
  • 725 打开转盘锁
  • 773 滑动拼图

2. 题目

【111 二叉树的最小深度】

def minDepth(root):'''给定⼀个⼆叉树,找出其最⼩深度,最⼩深度是从根节点到最近叶⼦节点(没有⼦节点的节点)的最短路径上的节点数量leetcode: 111 二叉树的最小深度input:  [3,9,20,null,nul, 15, 7]3/   \9     20/  \15   7output: 2思路:1.2.3.'''if root is None:return 0q, depth = [root], 1while len(q) != 0:size = len(q)for i in range(size):cur = q[0]q.remove(q[0])if cur.left is None and cur.right is None:return depthif cur.left is not None:q.append(cur.left)if cur.right is not None:q.append(cur.right)depth += 1return depth

【725 打开转盘锁】

def openLock(deadends, target):'''你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' 。每个拨轮可以自由旋转:例如把 '9' 变为 '0','0' 变为 '9' 。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为 '0000' ,一个代表四个拨轮的数字的字符串。列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。字符串 target 代表可以解锁的数字,你需要给出解锁需要的最小旋转次数,如果无论如何不能解锁,返回 -1 。leetcode: 725 打开转盘锁input1: deadends = ["0201","0101","0102","1212","2002"], target = "0202"output1: 6input2:deadends = ["8888"], target = "0009"output2:1思路:1.2.3.'''def plus_one(s, i):new_s = []for ss in s:new_s.append(ss)if new_s[i] == '9':new_s[i] = '0'else:new_s[i] = str(int(new_s[i]) + 1)return "".join(new_s)def minus_one(s, i):new_s = []for ss in s:new_s.append(ss)if new_s[i] == '0':new_s[i] = '9'else:new_s[i] = str(int(new_s[i]) + 1)return "".join(new_s)q = ['0000']visited = set()step = 0while len(q) != 0:size = len(q)for i in range(size):cur = q[0]q.remove(q[0])if cur in deadends:continueif cur == target:return stepfor j in range(4):up = plus_one(cur, j)if up not in visited:q.append(up)visited.add(up)down = minus_one(cur, j)if down not in visited:q.append(down)visited.add(down)step += 1return -1

【773 滑动拼图】

def slidingPuzzle(board):'''在⼀个 2 x 3 的棋盘 board 上有 5 块卡⽚,⽤数字 1~5 来表示 , 以及⼀块空缺⽤ 0 来表示。⼀次「移动」定义为选择 0 与⼀个相邻的数字(上下左右)进⾏交换。进⾏若⼲次移动,使得 board 的结果是 [[1,2,3],[4,5,0]],则谜板被解开。给出⼀个谜板的初始状态,返回最少可以通过多少次移动解开谜板,如果不能通过移动解开谜板,则返回-1。leetcode: 773  滑动拼图input:board = [[1,2,3],[4,0,5]]output:1input:board = [[1,2,3],[5,4,0]]output:-1input:board = [[4,1,2],[5,0,3]]output:5思路:1.2.3.'''m, n, target = 2, 3, "123450"start_str = ""for i in range(m):for j in range(n):# 转换为一维的start_str += str(board[i][j])neighbor = [[1, 3],[0, 4, 2],[1, 5],[0, 4],[3, 1, 5],[4, 2]]def modify_str(s, i, v):if i >= len(s):print("[warning] can't modify string!")return sa = [_ for _ in s]a[i] = vnew_s = "".join(a)return new_sq, visited, step = [start_str], set(start_str), 0while len(q) != 0:size = len(q)for i in range(size):cur = q[0]q.remove(q[0])if target == cur:print(step)return stepidx = 0for i in range(6):if cur[i] == '0':idx = ibreakfor j in neighbor[idx]:before, after = cur[i], cur[j]new_board = modify_str(cur, i, after)new_board = modify_str(new_board, j, before)if new_board not in visited:q.append(new_board)visited.add(new_board)step += 1print(-1)return -1

【测试例】

if __name__ == "__main__":# print(openLock(["0201", "0101", "0102", "1212", "2002"], "0202"))# print(openLock(["8888"], '0009'))slidingPuzzle([[1,2,3],[4,0,5]])slidingPuzzle( [[1,2,3],[5,4,0]])slidingPuzzle([[4,1,2],[5,0,3]])

这篇关于【算法-面试】广度优先遍历bfs专题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996659

相关文章

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

多源 BFS

例题一 解法(bfs)(多个源头的最短路问题) 算法思路: 对于求的最终结果,我们有两种⽅式: • 第⼀种⽅式:从每⼀个 1 开始,然后通过层序遍历找到离它最近的 0 。 这⼀种⽅式,我们会以所有的 1 起点,来⼀次层序遍历,势必会遍历到很多重复的点。并且如果 矩阵中只有⼀个 0 的话,每⼀次层序遍历都要遍历很多层,时间复

C++面试八股文:std::deque用过吗?

100编程书屋_孔夫子旧书网 某日二师兄参加XXX科技公司的C++工程师开发岗位第26面: 面试官:deque用过吗? 二师兄:说实话,很少用,基本没用过。 面试官:为什么? 二师兄:因为使用它的场景很少,大部分需要性能、且需要自动扩容的时候使用vector,需要随机插入和删除的时候可以使用list。 面试官:那你知道STL中的stack是如何实现的吗? 二师兄:默认情况下,stack使

Java面试八股之JVM参数-XX:+UseCompressedOops的作用

JVM参数-XX:+UseCompressedOops的作用 JVM参数-XX:+UseCompressedOops的作用是启用对象指针压缩(Ordinary Object Pointers compression)。这一特性主要应用于64位的Java虚拟机中,目的是为了减少内存使用。在传统的64位系统中,对象引用(即指针)通常占用8字节(64位),而大部分应用程序实际上并不需要如此大的地址空间

大林 PID 算法

Dahlin PID算法是一种用于控制和调节系统的比例积分延迟算法。以下是一个简单的C语言实现示例: #include <stdio.h>// DALIN PID 结构体定义typedef struct {float SetPoint; // 设定点float Proportion; // 比例float Integral; // 积分float Derivative; // 微分flo

二叉树三种遍历方式及其实现

一、基本概念 每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。 性质: 1、非空二叉树的第n层上至多有2^(n-1)个元素。 2、深度为h的二叉树至多有2^h-1个结点。 3、对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。 满二叉树:所有终端都在同一层次,且非终端结点的度数为2。 在满二叉树中若其深度为h,则其所包含

华为某员工爆料:偷偷跑出去面试,被面试官鄙视了。第一句话就问:华为淘汰的吧,35岁了,这个年龄在华为能混得下去吗?身体没啥毛病吧

“你都35岁了,难不成是被华为淘汰的?在华为混不下去了吧?身体没啥毛病吧,我们这体检可是很严的。” 近日,一位华为员工在朋友圈爆料,自己在面试时遭到了面试官的无理取闹和人身攻击,原因仅仅是因为他35岁了,曾经在华为工作过。 这番话,充满了傲慢与偏见,让人听了义愤填膺。这位面试官的言行,不仅是对求职者的不尊重,更是对职场规则的践踏。 面试本应是双向选择的过程,企业和求职者在相互了解的基

LeetCode 算法:二叉树的中序遍历 c++

原题链接🔗:二叉树的中序遍历 难度:简单⭐️ 题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 提示: 树中节点数目在范围 [0, 100] 内 -100 <= Node.