打开转盘锁 -- BFS

打开转盘锁

这里提供两种实现,单向BFS和双向BFS。

python 复制代码
class OpenLock:
    """
    752. 打开转盘锁
    https://leetcode.cn/problems/open-the-lock/
    """
    def solution(self, deadends: List[str], target: str) -> int:
        """
        单向BFS
        :param deadends: 
        :param target: 
        :return: 
        """
        visited = set()
        # 将deadends初始化到visited数组中
        for deadend in deadends:
            visited.add(deadend)

        queue = []
        step = 0
        queue.append('0000')
        visited.add('0000')

        while queue:
            sz = len(queue)
            for i in range(sz):
                cur = queue.pop(0)

                if cur == target:
                    return step

                if cur in visited:
                    continue

                visited.add(cur)

                for j in range(4):
                    up = self.plusOne(cur, j)
                    if up not in visited:
                        queue.append(up)

                    down = self.minusOne(cur, j)
                    if down not in visited:
                        queue.append(down)

            step += 1
        return -1

    def plusOne(self, cur, j):
        if cur[j] == '9':
            return cur[:j] + '0' + cur[j+1:]
        else:
            return cur[:j] + str(int(cur[j])+1) + cur[j+1:]

    def minusOne(self, cur, j):
        if cur[j] == '0':
            return cur[:j] + '9' + cur[j + 1:]
        else:
            return cur[:j] + str(int(cur[j]) - 1) + cur[j + 1:]

    def solution2(self, deadends: List[str], target: str) -> int:
        """
        双向BFS优化
        :param deadends: 
        :param target: 
        :return: 
        """
        deads = set()
        visited = set()
        # 将deadends初始化到visited数组中
        for deadend in deadends:
            deads.add(deadend)

        q1 = set()
        q2 = set()
        q1.add('0000')
        q2.add(target)
        step = 0

        while q1 and q2:
            # 额外优化
            if len(q1) > len(q2):
                tmp = q1
                q1 = q2
                q2 = tmp

            temp = set()
            for cur in q1:
                if cur in deads:
                    continue
                if cur in q2:
                    return step

                visited.add(cur)

                for j in range(4):
                    up = self.plusOne(cur, j)
                    if up not in visited:
                        temp.add(up)

                    down = self.minusOne(cur, j)
                    if down not in visited:
                        temp.add(down)

            step += 1
            # 这里temp相当于q1,交换q1和q2
            q1 = q2
            q2 = temp

        return -1
相关推荐
乌萨奇也要立志学C++11 小时前
【洛谷】BFS 求解最短路:从马的遍历到迷宫问题的实战解析
算法·宽度优先
WHD3062 天前
苏州误删除 格式化 服务器文件 恢复
随机森林·支持向量机·深度优先·爬山算法·宽度优先·推荐算法·最小二乘法
WHD3062 天前
苏州戴尔PowerEdge服务器 不开机 黄灯维修
决策树·散列表·广度优先·宽度优先
踩坑记录7 天前
leetcode hot100 104. 二叉树的最大深度 easy 递归dfs 层序遍历bfs
leetcode·深度优先·宽度优先
踩坑记录8 天前
leetcode hot100 226. 翻转二叉树 easy 递归 层序遍历 BFS
算法·leetcode·宽度优先
踩坑记录8 天前
leetcode hot100 easy 101. 对称二叉树 递归 层序遍历 bfs
算法·leetcode·宽度优先
晚风_END8 天前
postgresql数据库|pgbouncer连接池压测和直连postgresql数据库压测对比
数据库·postgresql·oracle·性能优化·宽度优先
Yupureki9 天前
《算法竞赛从入门到国奖》算法基础:搜索-多源BFS
数据结构·c++·算法·visual studio·宽度优先
4311媒体网9 天前
U++集成开发环境:提升编码效率
宽度优先·推荐算法
Yupureki11 天前
《算法竞赛从入门到国奖》算法基础:搜索-BFS初识
c语言·数据结构·c++·算法·visual studio·宽度优先