LeetCode 752. 打开转盘锁
Posted 数据结构和算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 752. 打开转盘锁相关的知识,希望对你有一定的参考价值。
截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666
public void levelOrder(TreeNode tree) {
Queue<TreeNode> queue = new LinkedList<>();
queue.add(tree);
int level = 0;//统计有多少层
while (!queue.isEmpty()) {
//每一层的节点数
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
//打印节点
System.out.println(node.val);
if (node.left != null)
queue.add(node.left);
if (node.right != null)
queue.add(node.right);
}
level++;
//打印第几层
System.out.println(level);
}
}
二叉树的BFS打印我们搞懂了之后,那么不管是8叉树还是100叉树,打印其实都是一样的,我们来看下最终代码
public int openLock(String[] deadends, String target) {
Set<String> set = new HashSet<>(Arrays.asList(deadends));
//开始遍历的字符串是"0000",相当于根节点
String startStr = "0000";
if (set.contains(startStr))
return -1;
//创建队列
Queue<String> queue = new LinkedList<>();
//记录访问过的节点
Set<String> visited = new HashSet<>();
queue.offer(startStr);
visited.add(startStr);
//树的层数
int level = 0;
while (!queue.isEmpty()) {
//每层的子节点个数
int size = queue.size();
while (size-- > 0) {
//每个节点的值
String str = queue.poll();
//对于每个节点中的4个数字分别进行加1和减1,相当于创建8个子节点,这八个子节点
//可以类比二叉树的左右子节点
for (int i = 0; i < 4; i++) {
char ch = str.charAt(i);
//strAdd表示加1的结果,strSub表示减1的结果
String strAdd = str.substring(0, i) + (ch == '9' ? 0 : ch - '0' + 1) + str.substring(i + 1);
String strSub = str.substring(0, i) + (ch == '0' ? 9 : ch - '0' - 1) + str.substring(i + 1);
//如果找到直接返回
if (str.equals(target))
return level;
//不能包含死亡数字也不能包含访问过的字符串
if (!visited.contains(strAdd) && !set.contains(strAdd)) {
queue.offer(strAdd);
visited.add(strAdd);
}
if (!visited.contains(strSub) && !set.contains(strSub)) {
queue.offer(strSub);
visited.add(strSub);
}
}
}
//当前层访问完了,到下一层,层数要加1
level++;
}
return -1;
}
以上是关于LeetCode 752. 打开转盘锁的主要内容,如果未能解决你的问题,请参考以下文章