题目
顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
矩阵为:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
思想
首先将第一行打印,并删除第一行
5 6 7 8
9 10 11 12
13 14 15 16
将矩阵逆时针旋转
8 12 16
7 11 15
6 10 14
5 9 13
将第一行打印,删除第一行
….
重复上述步骤,直到剩余矩阵为空。
代码
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
while(!matrix.empty()){ //判断剩余矩阵是否为空
for(int i = 0; i < matrix[0].size(); i++){
ans.push_back(matrix[0][i]); //输出第一行
}
matrix.erase(matrix.begin()); //删除第一行
temp = Contrarotate(matrix); //逆时针旋转矩阵
matrix.clear();
matrix = temp;
}
return ans;
}
vector<vector<int> > Contrarotate(vector<vector<int> > matrix){
vector<vector<int> > vec;
if(matrix.empty())return vec;
int m = matrix.size(), n = matrix[0].size();
vec.resize(n); //初始化旋转后的矩阵的大小
for(int c = 0; c < vec.size(); c++){
vec[c].resize(m);
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
vec[i][j] = matrix[j][n-1-i]; //逆时针旋转
}
}
return vec;
}
private:
vector<vector<int> > temp;
vector<int> ans;
};