最近雷军在宣传小米MimO核心团队的时候,首次公开了MiMo团队阵容。MiMo团队是小米公司旗下专注于大模型研发的团队,又称小米大模型Core团队。团队负责人为罗福莉,她于2025年11月加入小米。
据介绍,这支负责MiMo大模型研发的“Core Team”平均年龄仅为25岁,团队成员中,清华大学与北京大学的毕业生占比超过六成,博士学历占比55%。此言论一处,立即引发各大网友的质疑,说这不可能。
先不说这有没有可能,其实我现在特别不喜欢这种以平均年龄低为荣的行为,也可能是我年龄大了。记得刚毕业的时候,公司在年会上也会公布公司的平均年龄,HR就觉得平均年龄越低越有活力,越有前途。但我一直觉得平均年龄底是公司技术储备不足的体现,但没办法,现在企业都喜欢年轻的。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第1926题:迷宫中离入口最近的出口,难度是中等。
给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 '.' 表示)和墙(用 '+' 表示)。同时给你迷宫的入口 entrance ,用 entrance = [entrancerow, entrancecol] 表示你一开始所在格子的行和列。
每一步操作,你可以往 上,下,左或者右移动一个格子。你不能进入墙所在的格子,你也不能离开迷宫。你的目标是找到离 entrance 最近的出口。出口 的含义是 maze 边界 上的 空格子。entrance 格子不算出口。
请你返回从 entrance 到最近出口的最短路径的步数 ,如果不存在这样的路径,请你返回 -1 。
示例1:
输入:maze = [["+","+",".","+"],[".",".",".","+"],["+","+","+","."]], entrance = [1,2] 输出:1 解释:总共有 3 个出口,分别位于 (1,0),(0,2) 和 (2,3) 。 一开始,你在入口格子 (1,2) 处。 - 你可以往左移动 2 步到达 (1,0) 。 - 你可以往上移动 1 步到达 (0,2) 。 从入口处没法到达 (2,3) 。 所以,最近的出口是 (0,2) ,距离为 1 步。
示例2:
输入:maze = [["+","+","+"],[".",".","."],["+","+","+"]], entrance = [1,0] 输出:2 解释:迷宫中只有 1 个出口,在 (1,2) 处。 (1,0) 不算出口,因为它是入口格子。 初始时,你在入口与格子 (1,0) 处。 - 你可以往右移动 2 步到达 (1,2) 处。 所以,最近的出口为 (1,2) ,距离为 2 步。
maze.length == m
maze[i].length == n
1 <= m, n <= 100
maze[i][j] 要么是 '.' ,要么是 '+' 。
entrance.length == 2
0 <= entrancerow < m
0 <= entrancecol < n
entrance 一定是空格子。
问题分析
这题是让找出离入口最近的出口,入口也就是图中小人儿所在的位置,出口也就是矩形的边界,并且矩形中有墙,墙是不能过的。
查找最短距离我们首先想到的是使用宽度优先搜索(BFS),很明显这题是可以使用BFS来解决的。我们先把起始点添加到队列中,然后出队,遍历和它邻接的点(上下左右),并且不能是墙的位置,直到找到边界位置为止。
JAVA:
public int nearestExit(char[][] maze, int[] entrance) {
int m = maze.length, n = maze[0].length;
Queue que = new LinkedList<>();
que.offer(newint[]{entrance[0], entrance[1], 0});// 入口添加到队列中
maze[entrance[0]][entrance[1]] = '+';// 修改为墙,不要重复访问
int[][] dirs = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};// 方向数组
while (!que.isEmpty()) {
int[] cur = que.poll();// 出队一个元素
for (int[] dir : dirs) {// 遍历该元素的上下左右四个方向
int x = cur[0] + dir[0];
int y = cur[1] + dir[1];
// 不能越界,不能是墙
if (x < 0 || x >= m || y < 0 || y >= n || maze[x][y] == '+')
continue;
if (isSide(x, y, m, n))// 到达边界
return cur[2] + 1;
maze[x][y] = '+';// 标记为已访问过
que.offer(newint[]{x, y, cur[2] + 1});// 添加到队列中
}
}
return -1;
}private boolean isSide(int i, int j, int m, int n) {
return i == 0 || j == 0 || i == m - 1 || j == n - 1;
}
C++:
public:
int nearestExit(vector> &maze, vector &entrance) {
int m = maze.size(), n = maze[0].size();
queue> que;
que.push({entrance[0], entrance[1], 0}); // 入口添加到队列中
maze[entrance[0]][entrance[1]] = '+'; // 修改为墙,不要重复访问
// 方向数组:左、右、上、下
vector> dirs = {{0, -1},
{0, 1},
{-1, 0},
{1, 0}};
while (!que.empty()) {
vector cur = que.front();
que.pop();
for (auto &dir: dirs) {
int x = cur[0] + dir[0];
int y = cur[1] + dir[1];
// 不能越界,不能是墙
if (x < 0 || x >= m || y < 0 || y >= n || maze[x][y] == '+')
continue;
if (isSide(x, y, m, n)) // 到达边界
return cur[2] + 1;
maze[x][y] = '+'; // 标记为已访问过
que.push({x, y, cur[2] + 1}); // 添加到队列中
}
}
return-1;
}private:
bool isSide(int i, int j, int m, int n) {
return i == 0 || j == 0 || i == m - 1 || j == n - 1;
}
笔者简介
博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解900多题,对算法题有自己独特的解题思路和解题技巧。
热门跟贴