题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
样例
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
算法
(模拟)
- 当矩阵为空的时候,一定要放在最前面判断, 求尺寸size这些要放在后面。
- 每次将一个新的格子
A[x][y]
放入res
后,要将该格子的状态改变st[x][y] = true
- 最后的判定条件
if(a < 0 || a >= n || b < 0 || b >= m || st[a][b])
,都是||
,我一开始将st[][]
写道里面了,这样就不对了,就成&&
了,要注意一下hh。
时间复杂度
$O(n^2)$
因为矩阵中的每个格子都会被遍历一次,所以总时间复杂度是$O(n^2)$。
C++ 代码
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > A) {
vector<int> res; // **2
if(A.empty()) return res;
int n = A.size(), m = A[0].size();
vector<vector<bool> > st(n, vector<bool> (m, false));
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int x = 0, y = 0, d = 1;
for(int i = 0; i < n * m; i ++)
{
res.push_back(A[x][y]);
st[x][y] = true; // **3
int a = x + dx[d], b = y + dy[d];
if(a < 0 || a >= n || b < 0 || b >= m || st[a][b]) // **1
{
d = (d + 1) % 4;
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
}
return res;
}
};