谷歌面试题:最小步数
描述
有一个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,我们可以通过宽度优先搜索来完成。宽度优先搜索通过维护一个队列来计算最短路,每次取出队首的元素,并将相邻的