[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
一个n*n矩阵像上面这样,自然数从1到n,由外到里螺旋者走,这样叫Spiral Matrix。
现在有两件事:第一件事是让你生成一个这样的矩阵;第二件事是给你一个普通的矩阵,让你按照这样的顺序(Spiral Order)来遍历这个矩阵。
数学上位置和数字似乎没有什么特别的规律,那就按照人家要求的老老实实地转圈吧!
问题一:生成一个蛇形矩阵
class Solution { public: vector<vector<int> > generateMatrix(int n) { vector<vector<int> > matrix; if(n <= 0) return matrix; vector<int> tmp; int i, j; for(i=0;i<n;i++) tmp.push_back(0); for(i=0;i<n;i++) matrix.push_back(tmp); int level; int k = 1; for(level = 1;level<=(n+1)/2;level++) { i = j = level-1; //i:level-1, j:level-1~n-level for(;j<=n-level;j++) matrix[i][j] = k++; j--; i++; //i:level~n-level, j:n-level for(;i<=n-level;i++) matrix[i][j] = k++; i--;j--; //i:n-level, j:n-level-1~level-1 for(;j>=level-1;j--) matrix[i][j] = k++; j++;i--; //i:n-level-1~level, j:level-1 for(;i>=level;i--) matrix[i][j] = k++; } return matrix; } };
注意:这一次,我增加难度,矩阵不再是n*n,而是n*m。不能再依据层数来判断是否结束,而要每走完一个方向都判断一下是否结束。
class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> output; int m = matrix.size(); if(m == 0) return output; int n = matrix[0].size(); int i, j; i = j = 0; int n1, n2; n1 = n2 = 0; while(true) { if(j > n-1-n1) break; while(j<=n-1-n1) output.push_back(matrix[i][j++]); j--; i++; if(i > m-1-n2) break; while(i<=m-1-n2) output.push_back(matrix[i++][j]); i--;j--; if(j < n1) break; while(j>=n1) output.push_back(matrix[i][j--]); j++;i--; if(i <= n2) break; while(i>n2) output.push_back(matrix[i--][j]); i++;j++; n1++; n2++; } return output; } };