[Python 3]魔法数字 - BFS

魔法数字

http://www.nowcoder.com/questionTerminal/a0e34486102948a7b5e8b7b6d76cee96

根据题意, 数字 n 的三种可能转化方式: n -> n - 1 or n + 1 or n * n
因此, 可从n开始进行广度优先搜索, 记录当前数字 curNum 以及当前的操作步数 curStep, 并使用一个 set 记录已访问过的数字, 将curNum - 1, curNum + 1, curNum * curNum中未被访问的数字添加到搜索队列. 当curNum == m时搜索结束, 返回此时的操作步数, 即为所求的最少步数(因为步数是不断 +1 的, 可看作在所有边权值均为1的图上, 从n到m的最短距离)
[注] 由于n -> n + 1以及n -> n * n这两种转化方式的存在, n会越来越大甚至超过m, 因此需要进行一次"剪枝": n不超过m时, 才能进行上述转化.

#
# 返回最后要输出的答案
# @param n int整型 表示牛牛的数字
# @param m int整型 表示牛妹的数字
# @return int整型
#
class Solution:
    def solve(self , n , m ):
        que = [[n, 0]]
        seen = set(); seen.add(n)
        while que:
            curNum, curStep = que.pop(0)
            if curNum == m:
                return curStep
            if curNum - 1 not in seen:
                que.append([curNum - 1, curStep + 1])
                seen.add(curNum - 1)
            if curNum <= m and (curNum + 1 not in seen):
                que.append([curNum + 1, curStep + 1])
                seen.add(curNum + 1)
            if curNum <= m and (curNum * curNum not in seen):
                que.append([curNum * curNum, curStep + 1])
                seen.add(curNum * curNum)
        return -1
全部评论

相关推荐

2024-12-26 20:46
复旦大学 C++
国棉17厂丶小王:拿了offer的那个周末晚上去网吧通宵,去网吧不知道玩什么刷了lc的每日一题,然后试着第一次打开了三角洲行动,从此少了一个已经刷了700道题的lc用户,但是烽火地带多了一只🐭🐭
点赞 评论 收藏
分享
点赞 评论 收藏
分享
兄弟们,绩效自评一定得给自己打A啊!千万别谦虚给低分,不然领导正愁给谁高分,你这不就“主动请缨”了嘛,而且多数领导不会给你更高分。我几年前试用期绩效自评打了B,领导就给了同等级,还好是试用期。真别等领导主动给高评价!
准备进厂的劳伦斯很迷人:小学时候有个册子 自评 小组 老师 我谦虚打了个b 小组别人给我打b 老师来句我觉得能给他打a 但是小组长说他自评是b怎么能打高呢 那时候我才明白的道理
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务