当青训营遇上码上掘金
这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天,第五届字节跳动青训营主题创作活动我选择了主题 3:寻友之旅。以下是我对题目解答思路与解答代码。
01 题目
主题 3:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
02 实现思路
2.1 动态规划
- 使用动态规划的思想实现。
- 首先初始化数组dp,dp[N]表示从地点N出发到终点K所需要的最少时间, 则有dp[K]=0;
- 令dp[i]表示从地点i出发到终点K所需要的最少时间,可得状态转移方程:
- 也就是说从地点i出发,可选择两种方式:
- 1、步行到达地点i+1,从i+1出发的最快时间为dp[i+1]+1;
- 2、坐公交到达地点2i,从2i出发的最快时间为dp[2*i]+1;
- 将上述两种情况的最快时间选择较小的作为出发地点的最小时间。
- 也就是说从地点i出发,可选择两种方式:
2.2 BFS
- 本题还可以用广度优先搜索来解决。
- 使用一个队列q来保存状态,队列中每一个元素也是一个元组(x,step),表示当前小码在x,所用时间step
- 使用一个set s来保存已经访问过的状态,保证不重复搜索。
- 每次从队列中取出一个元素(x,step)
- 如果x=K,则表示小码已经到达而小青则返回step、
- 如果x!=K,则把x加入到set s中,然后把新的状态(x+1,step+1)、(x-1,step+1)、(2* x,step+1) 加入到队列中,表示将小青从x移动到x+1, x-1 或 2*x 并用了1分钟时间。
- 重复上述步骤直到小青到达小码停止。
03 代码
3.1 动态规划代码