主题 3:寻友之旅代码思路

66 阅读2分钟

当青训营遇上码上掘金,这是一道典型的最短路径问题,这道算法题看起来是一道简单的求最短路径的问题,但是在细节上有不少需要注意的地方,需要进行一定的思考。

首先,考虑使用动态规划求解。使用动态规划解决这个问题可以减少计算量,提高效率。根据题目条件,小青有两种交通方式可选,步行和公交。步行的方式可以从 i-1 或 i+1 到达 i,所需要的时间都是 1 分钟,公交的方式可以从 i 到达 2i,所需要的时间也是 1 分钟。 根据这个条件,我们可以列出状态转移方程:f(i) = min{f(i-1), f(i+1), f(2i)} + 1

然而,测试时发现由于小青有两种交通方式,步行和公交,而状态转移方程中只考虑了步行和公交的时间一致的情况,没有考虑到公交所需要的时间比步行要短的情况,因此,这个算法并不能得到正确的结果。

考虑用广度优先搜索,我们需要定义一个队列来存储待处理的节点,初始化时将起点N加入队列,并将其到起点的时间设为0。

搜索过程

接下来,我们进行搜索。每次从队列中取出一个节点进行扩展,扩展的过程包括:

  • 步行:当前节点能够到达的位置有X-1和X+1,如果这两个位置在[0,K]的范围内且没有被访问过,就将它们加入队列中,并将它们到起点的时间设为当前节点到起点的时间加1。
  • 公交:当前节点能够到达的位置有2*X,如果这个位置在[0,K]的范围内且没有被访问过,就将它加入队列中,并将它到起点的时间设为当前节点到起点的时间加1。

搜索过程一直持续到队列为空,或者找到了终点K。如果队列为空,说明小青无法到达小码的位置,返回-1。否则,返回队列中最后一个节点到起点的时间,即为小青到小码家所需的最短时间。使用BFS求解这道题的思路相对简单,实现也比较容易。因为题目规模比较小,所以BFS的时间复杂度可以接受。