[ [ 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;
}
};