从M走到N最少步数

题目描述:

假设一个人站在 X 轴的正半轴上,起始点在 M 点(0 <= M <= 100000),他每次可以向左走一步,向右走一步,或者走到所在坐标乘以2的位置,最终来到 N 点(0 <= N <= 100000)。问:所需的最少步数是几步?(如果不能从 M 走到 N 点,则返回 -1)

举例:M = 2,N = 13,则按照 2 -> 3 -> 6 -> 12 -> 13 的走法,最少步数是 4。

解题思路:

此题可用广搜 + 剪枝的方法,可以理解为一棵三叉树。树的结点表示走到的位置,树的深度表示走的步数。这棵三叉树有一个重要的特点:先出现的新结点(新位置)一定是走得最少的步数的位置。

举例说明:

第 0 层                                 4
                              /         |           \
                            3           5             8
                         /  |  \      /  |  \       /  |  \
                       2    4*  6     4  6* 10      7  9  16                

在这棵三叉树中,第 2 层的 4*,在起始点处已经走过,所以要剪去这个分支,不然会无限往下增加深度;同理,第二个出现的 6* 也要剪去。

具体实现过程,可以维护一个队列 q 和一个已走过的位置数组 visit。q 中是树的结点,代表当前所在位置。visit 数组记录位置是否走过,如果走过,标记为 True。visit 的作用就是用来剪枝,防止已经走过的位置又重新加入到队列 q 中。

如果 M 能到达 N,则结果一定会出现在队列 q 中,这就是程序的出口。

Python 实现:
from collections import deque
class Solution:
    def minStep(self, begin, end):
        """
        :type begin: int, 0 <= begin <= MAX
        :type end: int, 0 <= end <= MAX
        :rtype: int
        """
        MAX = 100000
        if begin < 0 or end < 0 or begin > MAX or end > MAX: # 输入不合法
            return -1
        visit = [False] * (MAX + 1) # 某个结点已经走过
        visit[begin] = True
        sq = deque()  # 新位置结点进入队列
        step = 0
        sq.append((begin, 0))
        while sq:  # 外层循环步数加1,表示当前层 sq 中所有结点判断完
            while sq and sq[0][1] == step:  # 当前层
                i = sq.popleft()
                if i[0] == end:   # 出口必然是队列中的结点
                    return step
                if 0 <= i[0] + 1 <= MAX and not visit[i[0] + 1]:  # 剪枝
                    sq.append((i[0] + 1, step + 1))
                    visit[i[0] + 1] = True
                if 0 <= i[0] - 1 <= MAX and not visit[i[0] - 1]:  # 剪枝
                    sq.append((i[0] - 1, step + 1))
                    visit[i[0] - 1] = True
                if 0 <= i[0] * 2 <= MAX and not visit[i[0] * 2]:  # 剪枝
                    sq.append((i[0] * 2, step + 1))
                    visit[i[0] * 2] = True
            step += 1
        return step

begin = 2
end = 13
print(Solution().minStep(begin, end))  # 4
知识补充:

1、Pyton 双向队列用法:

from collections import deque
q = deque() 

这是一个双向队列,可以把它理解成一个列表,只不过在左右两侧都可以进行插入和弹出操作:

q.append(i)
q.appendleft(i)  # 左侧插入
q.insert(ind, val)  # 在索引 ind 前插入一个值 val
i = q.pop()   # 右侧删除
i = q.popleft()  # 左侧删除
if q:   # 判断不为空
    #...
q[0]  # 得到队列头元素
q[-1]  # 得到队列尾元素
q.clear()  # 清空队列
q.reverse() # 队列中的所有元素进行翻转
q.rotate()   # 向右旋转队列 n步(默认 n = 1),如果n为负,向左旋转。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,624评论 0 13
  • 在看过大话西游后,便期待着紫霞仙子所说的,总有一天,我的意中人会驾着七彩白云来接我。但我的身边没有驾着七彩白云的盖...
    七篇阅读 310评论 2 2
  • 一次与朋友睡不着的猫聊天,我担忧地说儿子每天都草草做完作业,为的是好好玩游戏,这样下去,怎么可以? 谁料对方给我打...
    与君共读一本书99阅读 630评论 19 13
  • 今天,我看到这样一个故事: 女主出生在大阪,中学时期和一个做荞麦面的男生相爱了,高中毕业后男生开了面...
    Xtisly阅读 333评论 0 0