程序员须知:大厂面试最容易被问到的算法题(附答案)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

谷歌面试题:最小步数

描述
有一个1∗n的棋盘,分别标号为0,1,2…n−1,棋盘的每个格子都有一种颜色。
现在,在0号位置有一枚棋子,请求出最少移动几步能到达最后一格。
棋子有3种移动的方法,且棋子不能移出到棋盘外:

  1. 棋子从位置 i 移动到位置 i+1。
  2. 棋子从位置 i 移动到位置 i−1。
  3. 如果位置 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,我们可以通过宽度优先搜索来完成。宽度优先搜索通过维护一个队列来计算最短路,每次取出队首的元素,并将相邻的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值