Spiral Matrix
给定一个m*n的矩阵,按照顺时针方向,返回螺旋方向上的元素列表。
比如给定矩阵
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
应该返回:
[1,2,3,6,9,8,7,4,5]
其实就是遍历,每次遍历都是从左到右,从上到下,从右到左,从下到上4个步骤,但需要注意有可能不需要走4步的情况。从(0,0)开始然后是(1,1),(2,2)...(start,start).结束条件是2*start<m并且2*start<n。代码如下:
class Solution {
public:
vector<int> ret;
vector<int> spiralOrder(vector<vector<int> > &matrix) {
int m=matrix.size();
if(m<=0){
return ret;
}
int n=matrix[0].size();
int start=0;
while(m>start*2&&n>start*2){
getSpiralOrder(matrix,m,n,start);
start++;
}
return ret;
}
void getSpiralOrder(vector<vector<int> > &matrix,int m,int n,int start){
int endX=n-start-1;
int endY=m-start-1;
for(int i=start;i<=endX;i++){
ret.push_back(matrix[start][i]);
}
if(start<endY){
for(int i=start+1;i<=endY;i++){
ret.push_back(matrix[i][endX]);
}
}
if(start<endY&&start<endX){
for(int i=endX-1;i>=start;i--){
ret.push_back(matrix[endY][i]);
}
}
if(start<endY-1&&start<endX){
for(int i=endY-1;i>=start+1;i--){
ret.push_back(matrix[i][start]);
}
}
}
};
还有一个简洁版的,来源于网上:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> ret;
int m=matrix.size();
if(m<=0){
return ret;
}
int n=matrix[0].size();
int beginX=0,endX=n-1;
int beginY=0,endY=m-1;
while(true){
for(int i=beginX;i<=endX;i++){
ret.push_back(matrix[beginX][i]);
}
if(++beginY>endY)break;
for(int i=beginY;i<=endY;i++){
ret.push_back(matrix[i][endX]);
}
if(--endX<beginX)break;
for(int i=endX;i>=beginX;i--){
ret.push_back(matrix[endY][i]);
}
if(--endY<beginY)break;
for(int i=endY;i>=beginY;i--){
ret.push_back(matrix[i][beginX]);
}
if(++beginX>endX)break;
}
return ret;
}
};
Spiral Matrix II
跟上面的相比,简化为n*n矩阵,给定n,按照螺旋形给n*n矩阵填充1到n*n的数字。
代码如下:
class Solution {
public:
vector<vector<int> > generateMatrix(int n) {
vector<vector<int>> matrix(n,vector<int>(n,0));
int num=1;
int i,j;
for(i=0;i<n/2;i++){
for(j=i;j<=n-1-i;j++){
matrix[i][j]=num++;
}
for(j=i+1;j<=n-1-i;j++){
matrix[j][n-1-i]=num++;
}
for(j=n-2-i;j>=i;j--){
matrix[n-1-i][j]=num++;
}
for(j=n-2-i;j>i;j--){
matrix[j][i]=num++;
}
}
if(n%2==1){
matrix[n/2][n/2]=num;
}
return matrix;
}
};
或者根据上一题的第二个代码修改:
class Solution {
public:
vector<vector<int> > generateMatrix(int n) {
vector<vector<int>> matrix(n,vector<int>(n,0));
int beginX=0,endX=n-1;
int beginY=0,endY=n-1;
int num=1;
while(true){
for(int i=beginX;i<=endX;i++){
matrix[beginX][i]=num++;
}
if(++beginY>endY)break;
for(int i=beginY;i<=endY;i++){
matrix[i][endX]=num++;
}
if(--endX<beginX)break;
for(int i=endX;i>=beginX;i--){
matrix[endY][i]=num++;
}
if(--endY<beginY)break;
for(int i=endY;i>=beginY;i--){
matrix[i][beginX]=num++;
}
if(++beginX>endX)break;
}
return matrix;
}
};