54. Spiral Matrix
题目大意
Given an m x n
matrix, return all elements of the matrix in spiral order.
中文释义
给定一个 m x n
的矩阵,按螺旋顺序返回矩阵中的所有元素。
示例
-
示例 1:
- 输入:
matrix = [[1,2,3],[4,5,6],[7,8,9]]
- 输出:
[1,2,3,6,9,8,7,4,5]
- 输入:
-
示例 2:
- 输入:
matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
- 输出:
[1,2,3,4,8,12,11,10,9,5,6,7]
- 输入:
限制条件
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
解题思路
方法:模拟螺旋遍历
思路
这个解法通过模拟螺旋路径来遍历矩阵。它从矩阵的左上角开始,按照右、下、左、上的顺序遍历矩阵,并在每个方向上移动直到边界或遇到已访问的元素。为了标记已访问的元素,使用特殊值 -200
。
算法步骤
-
初始化变量:初始化行索引
index_i
,列索引index_j
,行边界edge_i
,列边界edge_j
,以及结果向量ans
。设置totalCnt
为矩阵中元素总数。 -
螺旋遍历:当还有未访问的元素时(即
totalCnt
大于 0),按照以下步骤遍历:- 向右移动:当可以向右移动时(即下一个元素未被访问),更新
index_j
,将当前元素添加到结果中,并将其标记为已访问。 - 向下移动:同上,更新
index_i
,向下移动。 - 向左移动:同上,更新
index_j
,向左移动。 - 向上移动:同上,更新
index_i
,向上移动。
- 向右移动:当可以向右移动时(即下一个元素未被访问),更新
-
返回结果:当遍历完所有元素后,返回结果向量
ans
。
代码实现
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int index_i = 0, index_j = -1, edge_i = matrix.size(), edge_j = matrix[0].size();
vector<int> ans;
int totalCnt = edge_i * edge_j;
while (totalCnt) {
// 向右移动
while (totalCnt > 0 && index_j + 1 < edge_j && matrix[index_i][index_j + 1] != -200) {
index_j++;
ans.push_back(matrix[index_i][index_j]);
matrix[index_i][index_j] = -200;
totalCnt--;
}
// 向下移动
while (totalCnt > 0 && index_i + 1 < edge_i && matrix[index_i + 1][index_j] != -200) {
index_i++;
ans.push_back(matrix[index_i][index_j]);
matrix[index_i][index_j] = -200;
totalCnt--;
}
// 向左移动
while (totalCnt > 0 && index_j - 1 >= 0 && matrix[index_i][index_j - 1] != -200) {
index_j--;
ans.push_back(matrix[index_i][index_j]);
matrix[index_i][index_j] = -200;
totalCnt--;
}
// 向上移动
while (totalCnt > 0 && index_i - 1 >= 0 && matrix[index_i - 1][index_j] != -200) {
index_i--;
ans.push_back(matrix[index_i][index_j]);
matrix[index_i][index_j] = -200;
totalCnt--;
}
}
return ans;
}
};