题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
样例
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
分析:
方法一:
首先当模拟题暴力模拟一遍,锻炼下思维。
class Solution {
public:
vector<int> v;
vector<int> printMatrix(vector<vector<int> > matrix) {
if(matrix.empty()) return v;
int m = matrix.size(),n = matrix[0].size();
bool vis[m][n];
memset(vis,0,sizeof(vis));
int i = 0,j = 0;
while(v.size() < m * n){
while(j < n && !vis[i][j]){
v.push_back(matrix[i][j]);
vis[i][j] = true;
j++;
}
i++,j--;
while(i < m && !vis[i][j]){
v.push_back(matrix[i][j]);
vis[i][j] = true;
i++;
}
j--,i--;
while(j >= 0 && !vis[i][j]){
v.push_back(matrix[i][j]);
vis[i][j] = true;
j--;
}
i--,j++;
while(i >= 0 && !vis[i][j]){
v.push_back(matrix[i][j]);
vis[i][j] = true;
i--;
}
i++,j++;
}
return v;
}
};
方法二:
使用方向向量,简化下思路。和方法一一样,访问过的数都成为了边界,注意这里for循环内矩阵行列号变换的细节。
class Solution {
public:
vector<int> v;
vector<int> printMatrix(vector<vector<int> > matrix) {
if(matrix.empty()) return v;
int m = matrix.size(),n = matrix[0].size();
bool vis[m][n];
memset(vis,0,sizeof(vis));
int a = 0,b = 0,t = 0;
int dx[] = {0,1,0,-1},dy[] = {1,0,-1,0};
for(int k = 0;k < m * n;k++){
v.push_back(matrix[a][b]);
vis[a][b] = true;
int x = a + dx[t],y = b + dy[t];
if(x<0||x>=m||y<0||y>=n||vis[x][y]){
t = (t + 1) % 4;
x = a + dx[t],y = b + dy[t];
}
a = x,b = y;
}
return v;
}
};