题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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; } };