谷歌面试题:最小步数
描述
有一个1∗n的棋盘,分别标号为0,1,2…n−1,棋盘的每个格子都有一种颜色。
现在,在0号位置有一枚棋子,请求出最少移动几步能到达最后一格。
棋子有3种移动的方法,且棋子不能移出到棋盘外:
- 棋子从位置 i 移动到位置 i+1。
- 棋子从位置 i 移动到位置 i−1。
- 如果位置 i 和位置 j 的颜色相同,那么棋子可以直接从位置 i 移动到位置 j。
棋盘的大小为 1∗n,2≤n≤105。
第 i 格子的颜色编号 colorsi,满足 1≤colorsi≤n。
样例1
输入:
colors = [1, 2, 3, 3, 2, 5]
输出:
3
解释:
在样例中,棋子最少用 3 步走到最后的位置:
1. 从位置 0 走到位置 1。
2. 由于位置 1 和位置 4 的颜色相同,从位置 1 走到位置 4。
3. 从位置 4 走到位置 5。
解题思路
可以将棋盘看作一个所有边权为 11 的图,棋盘的格子就是图的节点,每个节点与相邻的节点各有一条边,与相同颜色的格子有一条边。我们需要在图上找到一条从位置 00 到位置 n−1n−1 的最短路。
由于图的边权均为 11,我们可以通过宽度优先搜索来完成。宽度优先搜索通过维护一个队列来计算最短路,每次取出队首的元素,并将相邻的未访问过的点加入队列,更新他们的最短距离。由于边权为 11 的性质,可以保证队列中存放的节点的距离的差的绝对值小于等于 11,同时也保证了队列中的单调性,从而证明了计算最短路的正确性。
如果把同颜色间的节点两两连边建图的话,空间开销会达到 O(N2)O(N2),内存限制不允许这么做。可以单独把每

本文介绍了谷歌面试中常见的算法问题——如何在1*n的棋盘上,找到从0号位置到达最后一格的最小步数。棋子可以向左、向右移动,或者跳到相同颜色的格子。通过将问题转化为寻找边权为1的图的最短路径,可以使用宽度优先搜索(BFS)解决。文章详细讲解了解题思路、空间复杂度和时间复杂度,并提供了源代码实现。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



