输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
思路:循环打印矩阵最外面一圈,打印完一圈之后缩小一圈继续循环打印。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) return {}; // 判空
int rows = matrix.size(), cols = matrix[0].size(); // 确定原始矩阵行数和列数
vector<int> print;
int left = 0, right = cols - 1, up = 0, down = rows - 1; // 原始矩阵上下左右四个边界
while (left <= right && up <= down) {
// 从左到右打印
// 停止条件说明会打印该行的最后一列元素
for (int col = left; col <= right; col++) {
print.push_back(matrix[up][col]);
}
// 从上到下打印
// 注意此时打印的第一个元素是up+1,
// 因为从左到右打印会将最后一列处在第一行的元素打印
for (int row = up + 1; row <= down; row++) {
print.push_back(matrix[row][right]);
}
// 这个if条件作用是判断是否只剩下一行或一列
// 若只剩下一行或一列,就不用进行循环内的打印
if (left < right && up < down) {
// 从右到左
// 注意打印到开头第二列位置停止
// 因为第一列元素由从下向上时打印
for (int col = right - 1; col > left; col--) {
print.push_back(matrix[down][col]);
}
// 从下到上
// 停止条件为打印到上面第二行元素
// 第一行元素由从左向右时打印
for (int row = down; row > up; row--) {
print.push_back(matrix[row][left]);
}
}
// 一圈打印完成之后
// 向内缩小一圈
left++;
right--;
up++;
down--;
}
return print;
}
};
-
时间复杂度:O(mn),其中 mm 和 nn 分别是输入矩阵的行数和列数。矩阵中的每个元素都要被访问一次。
-
空间复杂度:O(1)。除了输出数组以外,空间复杂度是常数。