当青训营遇上码上掘金-寻友之旅

58 阅读1分钟

当青训营遇上码上掘金-寻友之旅

本次青训营,我参加了“青训营 X 码上掘金”主题创作活动,选择了寻友之旅这个题目,这个题目要求我们让小青去找小码,位置分别为N,k, 其中0 <= N, k <= 100000,小青有三种移动方式,x - 1, x + 1或者x * 2,这样我们可以很轻松地想到采用广度优先遍历(bfs)的方法。

我们知道广度优先遍历是采用队列进行遍历,这种思想我们在二叉树和图里面经常用到。在这道题目中,我们可以是采用这种方法,先设置一个bool验证数组Val,长度为100001, 保证在所有可能的N,K都能在范围内,这个验证数组主要是防止在添加进队列时有之前已经遍历过的位置。接着直接套用广度优先遍历的通常做法,首先初始化队列queue, 并将小青的位置N作为初始值加入queue,接着进入for循环,当queue的长度不为零是进行循环,同时将这个时候的queue的长度值作为当前遍历深度的所有可能位置,记为cnt,再次进入以cnt > 0为条件的while循环(golang中是for循环)这时候取出当前队列头的值x,对三种上述三种可能的运动方式进行计算,当它们得到的值满足大于等于0,小于等于100000时,并且这个时候这个位置的值并没有被访问过,即此时得到的结果在vis验证数组中为false。这样就将它们加入队列中,入队结束后将当前cnt--,queue队列头弹出。当cnt == 0后,此时的深度值ans++,这样我们就成功利用bfs思想得到了结果

当然这里的思想还可以再优化一下,对于N > k的情况,也就是小青在小码前面时候,小青只能往后退,这时的行动方向只能是x - 1。 这样我们就得到了完整的答案了。

附代码