按照顺时针螺旋顺序遍历矩阵
在这篇文章中,我们将讨论如何按照顺时针螺旋顺序遍历一个给定的矩阵,并返回矩阵中的所有元素。我们将通过一个示例和详细的代码讲解来实现这一目标。
问题描述
给定一个 m x n
的矩阵 matrix
,按顺时针螺旋顺序返回矩阵中的所有元素。
示例 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
解决方案
我们将使用一个边界追踪的方法来解决这个问题。具体来说,我们将定义四个边界 top
、bottom
、left
和 right
,并在每次遍历一行或一列之后调整这些边界。
以下是详细的代码和解释:
class Solution {
public:
std::vector<int> spiralOrder(std::vector<std::vector<int>>& matrix) {
if (matrix.empty()) return {};
std::vector<int> order;
// 定义四个边界
int top = 0, bottom = matrix.size() - 1, left = 0, right = matrix[0].size() - 1;
while (top <= bottom && left <= right) {
// 1. 从左到右遍历当前的顶行
for (int col = left; col <= right; ++col) {
order.push_back(matrix[top][col]);
}
++top; // 顶行下移
// 2. 从上到下遍历当前的右列
for (int row = top; row <= bottom; ++row) {
order.push_back(matrix[row][right]);
}
--right; // 右列左移
// 3. 从右到左遍历当前的底行(需要检查是否还有行)
if (top <= bottom) {
for (int col = right; col >= left; --col) {
order.push_back(matrix[bottom][col]);
}
--bottom; // 底行上移
}
// 4. 从下到上遍历当前的左列(需要检查是否还有列)
if (left <= right) {
for (int row = bottom; row >= top; --row) {
order.push_back(matrix[row][left]);
}
++left; // 左列右移
}
}
return order;
}
};
详细解释
-
初始化边界:
top
和bottom
分别表示当前处理的行的上边界和下边界。left
和right
分别表示当前处理的列的左边界和右边界。
-
主循环:
- 当
top <= bottom
且left <= right
时,继续处理当前层的元素。
- 当
-
从左到右遍历顶行:
- 使用一个
for
循环从left
迭代到right
,将top
行的元素添加到结果中。 - 完成后,将
top
增加 1,表示顶行已经处理完毕。
- 使用一个
-
从上到下遍历右列:
- 使用一个
for
循环从top
迭代到bottom
,将right
列的元素添加到结果中。 - 完成后,将
right
减少 1,表示右列已经处理完毕。
- 使用一个
-
从右到左遍历底行:
- 首先检查
top
是否仍然小于等于bottom
,以确保还有行未处理。 - 使用一个
for
循环从right
迭代到left
,将bottom
行的元素添加到结果中。 - 完成后,将
bottom
减少 1,表示底行已经处理完毕。
- 首先检查
-
从下到上遍历左列:
- 首先检查
left
是否仍然小于等于right
,以确保还有列未处理。 - 使用一个
for
循环从bottom
迭代到top
,将left
列的元素添加到结果中。 - 完成后,将
left
增加 1,表示左列已经处理完毕。
- 首先检查
通过这种方式,我们可以按照顺时针螺旋顺序遍历整个矩阵,并将所有元素添加到结果向量 order
中。
总结
这种方法通过维护四个边界来控制遍历的方向,并在每次遍历一行或一列后调整相应的边界,确保每个元素都被正确地访问。该算法的时间复杂度为 O(m×n),其中 m 和 n 分别是矩阵的行数和列数。