【54. 螺旋矩阵】遇0或左侧边界换方向/收缩边界

 

方法1:右侧和下侧填0,遇0换方向,走过的值变成0,相当于边界。但要注意左侧的情况,因为左边没填0,所以要单独列出第0列的情况,即j==-1时也要换方向。 

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int xx[4]={0,1,0,-1};
        int yy[4]={1,0,-1,0};
        vector<int> res;
        int m=(int)matrix.size();//求矩阵行数
        // int m=sizeof(matrix)/sizeof(int);这个算出来不对,不知道为啥
        int n=(int)matrix[0].size();//求矩阵列数
        for(int i=0;i<m;i++)
        {
            matrix[i].push_back(0);
        }
        vector<int> zero;
        for(int i=0;i<=n;i++)
        {
            zero.push_back(0);
        }
        matrix.push_back(zero);
        int step=0;
        int i=0,j=0,k=0;
        while(step!=m*n)
        {
            step++;
            res.push_back(matrix[i][j]);
            matrix[i][j]=0;
            i+=xx[k];
            j+=yy[k];
            if(j==-1||matrix[i][j]==0)//最外圈左边记得判断,因为没加0,否则会越界!出现-1
            {
                i-=xx[k];
                j-=yy[k];
                k=(k+1)%4;
                i+=xx[k];
                j+=yy[k];
            }
        }
        return res;
    }
};

方法二:收缩边界

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        int m=(int)matrix.size();//求矩阵行数
        int n=(int)matrix[0].size();//求矩阵列数
        //上下左右边界
        int u=0;
        int d=m-1;
        int l=0;
        int r=n-1;
        while(1)
        {
            for(int i=l;i<=r;i++)
            {
                res.push_back(matrix[u][i]);//向右移动直到最右
            }
            if(++u>d) break;//重新设定上边界,若上边界大于下边界,则遍历完成
            for(int j=u;j<=d;j++)
            {
                res.push_back(matrix[j][r]);
            }
            if(--r<l) break;//重新设定右边界
            for(int i=r;i>=l;i--)
            {
                res.push_back(matrix[d][i]);
            }
            if(--d<u) break;//重新设定下边界
            for(int j=d;j>=u;j--)
            {
                res.push_back(matrix[j][l]);
            }
            if(++l>r) break;//重新设定左边界
        }
        return res;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值