小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁

小黑代码1

class Solution:
    def openLock(self, deadends: List[str], target: str) -> int:

        deadends = set(deadends)
        # 起点是终点
        if target == '0000':
            return 0

        # 起点或终点在deadends里
        if target in deadends or '0000' in deadends:
            return -1

        # 获得右向拨动
        def forward(c):
            return str(int(c)+1) if c != '9' else '0'

        # 获得左向拨动
        def pre(c):
            return str(int(c)-1) if c != '0' else '9'
        
        # 获得孩子结点
        def get(str_):
            arr = list(str_)
            for i in range(4):
                c = arr[i]
                # 向右
                arr[i] = forward(c)
                yield ''.join(arr)
                # 向左
                arr[i] = pre(c)
                yield ''.join(arr)
                arr[i] = c
        
        # 初始化队列
        q = collections.deque([('0000', 0)])
        # 访问数组
        visited = {'0000'}

        # 开始进行宽度优先搜索
        while q:
            status, path_len = q.popleft()
            # 遍历邻居
            for str_ in get(status):
                if str_ == target:
                    return path_len+1
                if str_ not in visited and str_ not in deadends:
                    visited.add(str_)
                    q.append((str_, path_len+1))
        return -1

小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第1张图片

小黑代码2

# A*算法类
class Astar(object):
    
    def __init__(self, status, g, target):
        self.status = status
        self.g = g
        self.h = Astar.getH(status, target)
        self.f = self.g + self.h
    
    @staticmethod
    def getH(status, target):
        sum_ = 0
        for i in range(4):
            dis = abs(int(status[i])-int(target[i]))
            sum_ += min(dis, 10-dis)
        return sum_
    
    # 排序函数
    def __lt__(self, other):
        return self.f < other.f


class Solution:
    def openLock(self, deadends: List[str], target: str) -> int:
        deadends = set(deadends)
        # 起点就是终点
        if '0000' == target:
            return 0
        # 起点或终点在deadends
        if target in deadends or '0000' in deadends:
            return -1
        # 运动方向函数
        def forward(c):
            return str(int(c)+1) if c != '9' else '0'

        def pre(c):
            return str(int(c)-1) if c != '0' else '9'
        
        # 获得子结点
        def get(str_):
            arr = list(str_)
            for i in range(4):
                c = arr[i]
                arr[i] = forward(c)
                yield ''.join(arr)
                arr[i] = pre(c)
                yield ''.join(arr)
                arr[i] = c
        
        # 初始化优先队列
        q = [Astar('0000', 0, target)]
        # 初始化访问数组
        seen = {'0000'}
        # 队列操作
        while q:
            top = heapq.heappop(q)
            status = top.status
            g = top.g
            for str_ in get(status):
                if str_ == target:
                    return g+1
                if str_ not in seen and str_ not in deadends:
                    seen.add(str_)
                    heapq.heappush(q, Astar(str_, g+1, target))
        return -1

小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第2张图片

小黑生活

笔试加油

小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第3张图片
小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第4张图片
小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第5张图片

晚饭牛肚面

小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第6张图片

从公司骑车回家

小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第7张图片
小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第8张图片

光明楼门框卤煮夜宵,感觉体验没想象中的那么好

小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第9张图片
小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第10张图片
小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第11张图片

早上咖啡学习20min小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第12张图片

小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第13张图片

午饭牛肉拉面套餐

小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第14张图片
小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第15张图片

午后算法

小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第16张图片

小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第17张图片

这周还有半马,加油

小黑昨晚一个人从公司骑回家路上吃了门框卤煮当夜宵,明天开始两天笔试,正在准备放平心态不争高低的leetcode之旅:剑指 Offer II 109. 开密码锁_第18张图片

你可能感兴趣的:(leetcode,算法,python)