Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >从M走到N最少步数

从M走到N最少步数

作者头像
echobingo
发布于 2018-10-10 03:41:24
发布于 2018-10-10 03:41:24
81200
代码可运行
举报
运行总次数:0
代码可运行
题目描述:

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

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

解题思路:

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

举例说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
04
                              /         |           \
                            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 实现:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 双向队列用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from collections import deque
q = deque() 

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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为负,向左旋转。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.09.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
剑指offer【30~39】
除了存储数据的栈 stack,再定义一个最小栈 minstack。minstack 的长度和 stack 保持同步,只不过其是一个递减栈。如 stack = [6,7,4,5,3,8],则 minstack = [6,6,4,4,3,3]。这样,在 pop 的时候,同时 pop 两个栈,不会因为删除最小值而在 minstack 中找不到。
echobingo
2019/12/20
3870
NYOJ 58 最少步数(dfs或者bfs)
       这道题最开始是用dfs做的,后来学会了bfs以后有一次用bfs做了这道题,但是奇迹般的TLE了,当时还纠结了半天最少步数竟然不能用bfs做吗?然后刚刚又用bfs交了一次,又奇迹般的AC了,这道题可以当作bfs的模板了。下面把bfs和dfs的代码都贴上吧。
Ch_Zaqdt
2019/01/10
3840
杂七杂八的练习(1)
结构体Node作为链表结点,包含指针next与两个整型元素:value系数和index指数。
ttony0
2022/12/26
6510
杂七杂八的练习(1)
算法创作|迷宫问题解决方案
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。
算法与编程之美
2021/03/30
6560
算法创作|迷宫问题解决方案
【数据结构】二叉树的概述
文章目录 5. 树与二叉树 5.1 数的基本概念 5.1.1 树的定义 5.1.2 树的常用术语 5.2 二叉树的概述 5.2.1 基本概念 5.2.2 满二叉树定义 5.2.3 完全二叉树定义 5.2.4 单分支树的定义 5.2.5 二叉树的特性 5.2.6 存储结构 5. 树与二叉树 树形结构是一种非常重要的==非线性结构==,树形结构中数据元素之间具有==一对多==的逻辑关系。 5.1 数的基本概念 5.1.1 树的定义 树是由n(n>=0)个结点所构成的有限集合 当n=0时,称为空树
陶然同学
2023/02/26
6090
【数据结构】二叉树的概述
面试官:请算出走迷宫需要的最少步数
动态规划的算法题经常出现在大厂的面试中,它是非常适合考查候选人的一类题型,因为它难度适中,需要一定的技巧,而且根据习题可以有一定的变化,所以如果想去大厂,建议大家好好刷一下此类题目,接下来我会写一些动态规划的相关题解,希望能对大家理解此类习题有所帮助。
kunge
2020/09/03
1.4K0
面试官:请算出走迷宫需要的最少步数
matinal:python 链表、堆、栈
很多开发在开发中并没有过多的关注数据结构,当然我也是,因此,我写这篇文章就是想要带大家了解一下这些分别是什么东西。
matinal
2023/10/14
1890
matinal:python 链表、堆、栈
Leetcode【429、559、589、590、669】
二叉树的最大深度为 max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1,拓展到 N 叉树,只需要对于 root.children 的每一个孩子 child (for child in root.children),更新最大深度 ans = max(ans, self.maxDepth(child)),最后 ans + 1 就是答案。
echobingo
2019/10/29
3760
从 DFS 到回溯法,再看 N 皇后问题
上一篇 已经讲到了 DFS 一些基础的点,由于 DFS 太重要了,不得不再往前深挖一步!
掘金安东尼
2022/09/19
3280
从 DFS 到回溯法,再看 N 皇后问题
【使用Python实现算法】04 标准库(数据类型模块)
算法实现中经常需要构造和处理一些特殊的数据结构,Python 标准库中有一些模块可以帮到我们。
杜逸先
2023/04/13
4270
测试面试 | Python 算法与数据结构面试题系列二(附答案)
⬆️ 关注 @霍格沃兹测试学院 公众号,回复「面试」,领取 BAT 大厂测试面试真题专辑。
霍格沃兹测试开发
2020/12/23
4840
LeetCode 1293. 网格中的最短路径(DP/BFS)
给你一个 m * n 的网格,其中每个单元格不是 0(空)就是 1(障碍物)。 每一步,您都可以在空白单元格中上、下、左、右移动。
Michael阿明
2020/07/13
1.8K0
BFS广度优先遍历——Acwing 844. 走迷宫
我们可以将bfs当做一个成熟稳重的人,一个眼观六路耳听八方的人,他每次搜索都是一层层的搜索,从第一层扩散到最后一层,BFS可以用来解决最短路问题。
用户10604450
2024/03/15
1270
BFS广度优先遍历——Acwing 844. 走迷宫
剑指offer【50~59】
排序数组,很明显二分查找,找到第一个 >= k 的元素索引以及第一个 > k 的元素索引,两者相减即为答案,即 lowerBound - upperBound。时间复杂度为 O(logn),空间复杂度为 O(1)。
echobingo
2019/12/20
3730
Leetcode No.93 复原 IP 地址(DFS)
给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。
week
2021/11/29
6520
Leetcode No.93 复原 IP 地址(DFS)
农夫与牛(STL-Queue、广度优先搜索)
现有一农夫和一母牛,假设农夫和母牛都站在一条数轴上,农夫开始的位置为N,母牛的位置为K。农夫有三种行动方式,每行动一次需要一秒钟时间,假设农夫的现在的位置为X,他可以向前走一格到X+1,也可以向后走一格走到X-1,他还可以传送!一下子走到了2*X。那么我们的问题是,假设母牛不会动,农夫最少需要多少秒才能抓到母牛?
ACM算法日常
2018/12/28
7460
二叉树的性质和常用操作代码集合
二叉树的性质和常用操作代码集合 性质: 二叉树的性质和常用代码操作集合 性质1:在二叉树的第i层上至多有2^i-1个结点 性质2:深度为k的二叉树至多有2^k - 1个结点 性质3:对任意一棵二叉树T,若终端结点数为n0,而其度数为2的结点数为n2,则n0 = n2 + 1 满二叉树:深度为k且有2^-1个结点的树 完全二叉树:深度为k,结点数为n的二叉树,如果其结点1~n的位置序号分别与等高的满二叉树的结 点1~n的位置序号一一对应,则为完全二叉树
Steve Wang
2018/02/05
7130
剑指offer【40~49】
时间复杂度为:插入为 O(logn),计算中位数为 O(1);空间复杂度:O(n)。
echobingo
2019/12/20
4650
剑指offer【40~49】
Leetcode | 第7节:DFS,BFS
这一节我们介绍一下DFS和BFS,也就是深度优先搜索和广度优先搜索。搜索算法也是很多题目我们所会考虑的第一个算法,因为想法直接而易想。本来是要介绍树有关的内容的,但是研究了一下材料发现,其实树相关的题目还是挺多需要用到我们这一节说到的搜索算法的,所以我们就临时换了一下介绍顺序。
学弱猹
2021/08/10
6320
Leetcode | 第7节:DFS,BFS
【python刷题】广度优先搜索(BFS)
一般来说,BFS使用的数据结构是队列。 BFS模板 from collections import deque def BFS(start, target): q = deque() # 核心数据结构 visited = set() # 避免走回头路 q.append(start) # 将起点加入到队列 visited.add(start) step = 0 # 记录扩散的步数 while q is not None: s = len(q)
西西嘛呦
2021/02/05
1K0
相关推荐
剑指offer【30~39】
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文