LeetCode 力扣 热题 100道(二十九)螺旋矩阵(C++)
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
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, left = 0, right = n - 1;
while (top <= bottom && left <= right) {
// 从左到右遍历 top 边界
for (int j = left; j <= right; ++j) {
result.push_back(matrix[top][j]);
}
++top;
// 从上到下遍历 right 边界
for (int i = top; i <= bottom; ++i) {
result.push_back(matrix[i][right]);
}
--right;
// 从右到左遍历 bottom 边界
if (top <= bottom) {
for (int j = right; j >= left; --j) {
result.push_back(matrix[bottom][j]);
}
--bottom;
}
// 从下到上遍历 left 边界
if (left <= right) {
for (int i = bottom; i >= top; --i) {
result.push_back(matrix[i][left]);
}
++left;
}
}
return result;
}
};
定义四个边界:
top
:矩阵的上边界(初始为0)。
bottom
:矩阵的下边界(初始为m-1
)。
left
:矩阵的左边界(初始为0)。
right
:矩阵的右边界(初始为n-1
)。
按顺时针顺序遍历:
从左到右遍历 top
边界,然后将 top
增加1。
从上到下遍历 right
边界,然后将 right
减少1。
从右到左遍历 bottom
边界(如果未越界),然后将 bottom
减少1。
从下到上遍历 left
边界(如果未越界),然后将 left
增加1。
终止条件:
当 top > bottom
或 left > right
时,遍历结束。