题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.
过程:
一开始没注意矩阵,后来又卡在奇数矩阵最后一个不打印(边界设置为<时前面的都很完美,但是最后一个落单的话不输出。)改边界为=后遇到了极端情况竖排一列,看题解发现这题根本无技巧可言都是细节费事(想到了魔方旋转打印一行删一行,但c++旋转矩阵甚麻烦)。打算半个小时的题花了2个小时。
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> v;
int height = matrix.size();
int width = matrix[0].size();
int i=0, j=0, layer=1;
for(int t=0;t<height*width;){
for(;j<=width-layer;++t,++j)
v.push_back(matrix[i][j]);
i++;j--;
if(t==height*width) //防止极端情况的
break;
for(;i<=height-layer;++t,++i)
v.push_back(matrix[i][j]);
i--;j--;
if(t==height*width) //防止极端情况的
break;
for(;j>=layer-1;++t,--j)
v.push_back(matrix[i][j]);
i--;j++,layer++;
if(t==height*width)//防止极端情况的
break;
for(;i>=layer-1;++t,--i)
v.push_back(matrix[i][j]);
i++;j++;
if(t==height*width)//防止极端情况的,其实真正的极端情况只有这里会
break;
}
return v;
}
};极端情况靠计数结束防止,出现极端情况的肯定是已经结束了(触碰边界)
旋转矩阵思路(一个班小时。。,py多容易。。)
class Solution {
public:
vector<vector<int>> rotate(vector<vector<int>> v){
vector<vector<int>> map;
if(v.empty())
return map;
for(int i=v[0].size()-1;i>=0;--i){
vector<int> row;
for(int j=0;j<v.size();++j){
row.push_back(v[j][i]);
}
map.push_back(row);
}
return map;
}
vector<int> printMatrix(vector<vector<int> > matrix){
vector<int> v;
while(!matrix.empty()){
for(int i=0;i<matrix[0].size();++i){
v.push_back(matrix[0][i]);
}
matrix.erase(matrix.begin());
matrix = rotate(matrix);
}
return v;
}
};
京公网安备 11010502036488号