Leetcode:打开转盘锁

原题 一道关于BFS的题目

先上代码:

class Solution(object):
    def openLock(self, deadends, target):
#这里转为SET类很有必要。
        deadends = set(deadends)
#先判断是否是特殊情况。
        if "0000" in deadends or target in deadends:
            return -1
#创建初始队和已访问,这里采用双向搜索。
        q1,v1 = set(["0000"]), set(["0000"])
        q2,v2 = set([target]), set([target])
#计次
        t = 1
        while q1 and q2:
            newq = set()            
            for s in q1:
#生成临近密码,我觉得这种表达已经非常精简了,可以将9和0的情况包含在内。
#当然表达法不唯一,也不是重点。
                s1 = [s[:i] + str(int(s[i])+9)[-1] + s[i+1:] for i in range(4)]
                s2 = [s[:i] + str(int(s[i])+1)[-1] + s[i+1:] for i in range(4)]
#防问密码
                for i in s1+s2:
                    if i in v2:
                        return t
#不过则入队
                    if not i in deadends:
                        v1.add(i)
                        newq.append(i)
#计数加一
            t += 1
#判断是否转变方向,选取更窄的一侧
            if len(newq) < len(q2):
                q1 = newq
                continue
#转向
            q1, q2 = q2, newq
            v1, v2 = v2, v1
        return -1

一开始我的解法总是超时,抄了份答案后发现解法同其他人几乎一摸一样,速度却慢了很多很多。对比后发现仅仅是队的类型:用的是List仅此而已,改过后瞬间就AC了。

查阅后发现:官网wiki

CSDN上的翻译: BY 咕叽咕叽小菜鸟

我服了,但还是不太理解为什么list要慢一个量级

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值