752. 打开转盘锁(仅思路)

思路:
广度优先搜索

关键点:

  1. 如何把死亡数字转换成入队时的判断条件
  2. 如何获取下一组可以调整的数字(地位等同于广度搜索的下一层节点)

参考代码

public int openLock(String[] deadends, String target) {
        //用来将数字转换为char的查询表
        char[] pos = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        Set set = new HashSet<>(Arrays.asList(deadends));
        LinkedList list = new LinkedList<>();
        if (target == null || target.length() == 0 || set.contains("0000"))
            return -1;
        list.add("0000");
        int depth = 0;
        //广度优先遍历
        while (!list.isEmpty()) {
            int size = list.size();
            while (size-- > 0) {
                String str = list.removeFirst();
                if (str.equals(target)) {
                    return depth;
                }
                if (!set.contains(str)) {
                    set.add(str);
                    list.addAll(getNextList(str, pos));
                }
            }
            //每一层遍历完,深度加一
            depth++;
        }
        return -1;
    }

    private List getNextList(String str, char[] pos) {
        List res = new ArrayList<>();
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            int num = chars[i] - '0';
            char[] newChars = chars.clone();
            newChars[i] = pos[(num + 11) % 10];     //数字加一
            res.add(new String(newChars));
            newChars[i] = pos[(num + 9) % 10];      //数字减一
            res.add(new String(newChars));
        }
        return res;
    }


你可能感兴趣的:(752. 打开转盘锁(仅思路))