[leetcode]Spiral Matrix&&Spiral Matrix II

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值