LeetCode 752. 打开转盘锁

Posted 数据结构和算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 752. 打开转盘锁相关的知识,希望对你有一定的参考价值。

截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
《373,数据结构-6,树》
在这里插入图片描述

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. 打开转盘锁的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 752. 打开转盘锁

LeetCode 752. 打开转盘锁 / 127. 单词接龙 / 773. 滑动谜题(学习双向BFS,A*算法)

752. 打开转盘锁

搜索

数据结构与算法之深入解析“打开转盘锁”的求解思路与算法示例

Leetcode算法思路