Problem: 3248. 矩阵中的蛇
题目重述
给定一个大小为 ( n x n ) 的矩阵 grid
,其中每个单元格的标识由公式 grid[i][j] = (i * n) + j
计算得出。蛇从矩阵的起始位置(单元格 0)开始,并根据给定的命令(“UP”、“RIGHT”、“DOWN” 和 “LEFT”)进行移动。题目保证在移动过程中蛇始终位于矩阵的边界内。需要返回执行完所有命令后,蛇所停留的最终单元格的位置。
关键词提取
- 矩阵大小:( n x n )
- 单元格标识:
grid[i][j] = (i * n) + j
- 起始位置:0
- 移动命令:[“UP”, “RIGHT”, “DOWN”, “LEFT”]
- 返回值:最终单元格的位置
解题思路分析
- 二维转一维:通过公式将二维坐标转换为一维索引,简化位置的计算。
- 命令解析:根据命令的不同,更新蛇的位置。
- 左移:
position--
- 右移:
position++
- 下移:
position += n
- 上移:
position -= n
- 左移:
- 边界条件:题目保证蛇在移动过程中不会越界,因此可以直接更新位置而无需检查边界。
算法思维模式
该解题思路运用了状态转移的算法思维模式。通过维护一个状态变量(蛇的当前位置),根据输入的命令逐步更新状态,最终得到结果。这种方法适用于动态变化的场景,通过简单的状态更新实现目标。
代码分析
class Solution {
public int finalPositionOfSnake(int n, List<String> commands) {
int position = 0; // 初始化蛇的起始位置为 0
for (String command : commands) {
switch (command) {
case "LEFT":
position--;
break;
case "RIGHT":
position++;
break;
case "DOWN":
position += n; // 向下移动
break;
case "UP":
position -= n; // 向上移动
break;
}
}
return position;
}
}
class Solution {
public:
int finalPositionOfSnake(int n, vector<string>& commands) {
int position = 0;
for (const string& command : commands) { // 遍历命令
if (command == "LEFT") {
position--; // 左移
} else if (command == "RIGHT") {
position++; // 右移
} else if (command == "DOWN") {
position += n; // 向下移动
} else if (command == "UP") {
position -= n; // 向上移动
}
}
return position; // 返回最终位置
}
};
时间复杂度分析
- 时间复杂度:O(m),其中 ( m ) 是命令的数量。因为我们需要遍历所有命令并根据命令更新位置,每个命令的处理时间是常数级别的。
空间复杂度分析
- 空间复杂度:O(1)。我们只使用了一个额外的变量
position
来存储蛇的当前位置,不依赖于输入的大小,因此空间复杂度是常数级别的。