class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> result;
// 处理空矩阵的情况
if (matrix.empty() || matrix[0].empty()) {
return result;
}
int m = matrix.size(); // 行数
int n = matrix[0].size(); // 列数
// 定义四个边界
int top = 0, bottom = m - 1;
int left = 0, right = n - 1;
while (top <= bottom && left <= right) {
// 从左到右遍历上边界
for (int j = left; j <= right; j++) {
result.push_back(matrix[top][j]);
}
top++;
// 从上到下遍历右边界
for (int i = top; i <= bottom; i++) {
result.push_back(matrix[i][right]);
}
right--;
// 检查是否还有行需要遍历
if (top <= bottom) {
// 从右到左遍历下边界
for (int j = right; j >= left; j--) {
result.push_back(matrix[bottom][j]);
}
bottom--;
}
// 检查是否还有列需要遍历
if (left <= right) {
// 从下到上遍历左边界
for (int i = bottom; i >= top; i--) {
result.push_back(matrix[i][left]);
}
left++;
}
}
return result;
}
};
算法思路:
- 边界定义:使用四个变量top、bottom、left、right来定义当前需要遍历的矩阵范围。
- 螺旋遍历:从左到右遍历上边界,然后上边界下移(top++)从上到下遍历右边界,然后右边界左移(right--)从右到左遍历下边界,然后下边界上移(bottom--)从下到上遍历左边界,然后左边界右移(left++)
- 终止条件:当上边界超过下边界或左边界超过右边界时,遍历结束。
- 边界检查:在遍历下边界和左边界前需要检查是否还有有效的行或列需要遍历,避免重复遍历。
复杂度分析:
- 时间复杂度:O(m × n),每个元素恰好被访问一次
- 空间复杂度:O(1),除了存储结果的数组外,只使用了常数级别的额外空间

京公网安备 11010502036488号