leetcode第一刷_Spiral Matrix

本文介绍了一种螺旋遍历二维数组(矩阵)的算法实现。通过定义层的概念,从外向内逐层遍历矩阵元素,并详细解释了如何确定遍历方向及边界条件。文章还分享了一些实现细节,如循环退出条件的设定。

我认为这个题好无聊啊,好端端一个数组。干嘛要跟比巴卜一样转一圈输出呢。

思想非常easy,每次从左到右。再从上到下,在从右到左,再从下到上。问题是每次到什么时候该改变方向。我的做法是用一个变量保存当前在第几层。这个层是相对于从外向内有几圈来说的。注意想清楚边界的话这个题一点也不难。有个细节,我的循环退出条件是訪问的数跟矩阵总个数之间的关系,假设有一次在推断进入循环是条件是满足的。可是在循环内部不满足了,我的策略是忽略这样的情况。尽管这样会在结果集中多加一些反复的数据,可是以我的算法。一定是先訪问没有訪问过的数据。再訪问反复数据的,因此能够回退回去。避免了考虑每次在循环里都考虑有没有到达越界的情况。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        int msize = matrix.size();
        vector<int> res;
        if(msize == 0)  return res;
        if(msize == 1)  return matrix[0];
        int cur = 0, row = msize, column = matrix[0].size(), i=0, j=0, level = 0;
        while(cur<row*column){
            while(j<column-level) {res.push_back(matrix[i][j++]); ++cur;}
            --j;++i;
            while(i<row-level)  {res.push_back(matrix[i++][j]); ++cur;}
            --j;--i;
            while(j>=level) {res.push_back(matrix[i][j--]); ++cur;}
            ++j;--i;
            while(i>level)  {res.push_back(matrix[i--][j]); ++cur;}
            ++j;++i;
            ++level;
        }
        while(cur>row*column){
            res.pop_back();
            cur--;
        }
        return res;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值