xyz的寻友之旅

127 阅读3分钟

当青训营遇上码上掘金

主题 3:寻友之旅

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)

分析

此题是一个简单的最短路径的问题,有多个切入点,能够使用不同的算法解决,根据算法分为以下几种方案。

BFS-贪心

我们可以使用广搜算法(BFS)来找到从起点 N 到终点 K 的最短路径。

在广搜中,我们使用队列来存储待遍历的节点,并使用一个访问数组来存储已经遍历过的节点。

我们从起点 N 开始遍历,将其入队。然后我们每次从队列中取出一个节点并遍历它的相邻节点。

对于步行,我们可以向当前节点的左右两个相邻节点移动一步,即从X移动到X-1或X+1,每次移动都需要1min。

对于公交,我们可以从当前节点移动到2*X,每次移动都需要1min。

当我们遍历到终点 K 时,我们就可以得到从起点 N 到终点 K 的最短路径所需的最短时间。

通过使用队列和访问数组来维护当前遍历的节点,我们可以在线性时间内求解最短路径。

代码实现: 测试结果:

输入 5 17

输出 5

动态规划

我们可以使用一个数组 dp 来存储从起点 N 到终点K之间的每个节点 i 的最短路径所需的最短时间。

因此,根据N、K大小关系,采取不同的方式递归

当N<K,此时小青有两种交通方式

使用转移方程 dp[i] = Min(dp[i-1]+1, dp[(i+start)/2] + 1) 来计算从起点 N 到点 i 的最短时间。

当N>K时,小青就只能选择步行

代码实现:

测试结果:

输入 5 17

输出 5

算法评析

问题:为什么两种算法有什么不同

在这道题目中,BFS和动态规划算法得出的结果可能不同,是因为它们是基于不同的假设来计算最短路径的。

BFS算法是基于深度优先搜索,它从起点开始广度优先搜索,找到第一个到达终点的路径就是最短路径。在这道题目中,BFS算法每次都是第一个走公交,然后再走步行。但是这种做法可能会忽略某些更优的路径,导致结果不正确。但根据本题的情况,每一步都是由上一步的最优组成的,局部解就是最优解,非常适合使用贪心算法,并不会产生错误。

而动态规划算法是通过递推的方式来解决子问题的策略。它首先将问题分解成若干子问题,然后通过记忆化或者递推的方式来避免重复计算已经解决过的子问题。在这道题目中,动态规划算法从终点开始往前递推,计算从起点到每个节点的最短路径。这样可以保证所有路径都被搜索到,并且每个节点只被计算一次,所以能得到正确答案。

总结来说,不同的算法在某些特定的情况下可能会有不同的结果,所以对于这道题目来说,BFS算法和动态规划算法都是正确的,可以根据需要选择使用。