刷题 | 螺旋矩阵

螺旋矩阵
方法一:找出螺旋规律,确定边界条件,循环塞入新数组中。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        int top = 0;
        int left = 0;
        int bottom = matrix.size()-1;
        int right = matrix[0].size()-1;
        vector<int> spma;
        while(top < (matrix.size()+1)/2 && left < (matrix.size()+1)/2)
        {
            //上面 从左到右
            for(int i = left; i<=right; i++)
                spma.push_back(matrix[top][i]);
            //右边 从上到下
            for(int i = top + 1; i <= bottom; i++)
                spma.push_back(matrix[i][right]);
            //下面 从右到左
            for(int i = right - 1; top != bottom && i >= left; i--)
                spma.push_back(matrix[bottom][i]);
            //左面 从下到上
            for(int i = bottom - 1;left != right && i >= top + 1;i--)
                spma.push_back(matrix[i][left]);
            ++top;
            --bottom;
            ++left;
            --right;
        }
        return spma;
    }
};

以上,测试案例通过,但提交时发生段溢出。

方法二:找出螺旋规律,一圈圈递归。

class Solution {
public:
    void SpiralOrder(vector<vector<int> > &matrix, int top, int bottom, int left, int right, vector<int> &ivec)
    {
        if(top > bottom || left > right)
            return;
        if(top == bottom)//只剩一行
        {
            for(int i = left; i <= right; i++)
                ivec.push_back(matrix[top][i]);
            return;
        }
        if(left == right)
        {
            for(int i = top; i <= bottom; i++)
                ivec.push_back(matrix[i][left]);
            return;
        }

        //上 从左到右
        for(int i = left; i < right; i++)
            ivec.push_back(matrix[top][i]);
        //右 从上到下
        for(int i = top; i < bottom; i++)
            ivec.push_back(matrix[i][right]);
        //下 从右到左
        if(top < bottom)
        {
            for(int i = right; i > left; i--)
                ivec.push_back(matrix[bottom][i]);
        }
        //左 从下到上
        if(left < right)
        {
            for(int i = bottom; i > top; i--)
                ivec.push_back(matrix[i][left]);
        }

        SpiralOrder(matrix,++top,--bottom,++left,--right,ivec);//递归

    }

    vector<int> spiralOrder(vector<vector<int> > &matrix) {
       if(matrix.empty())
           return vector<int>();
        vector<int> ivec;
        SpiralOrder(matrix,0,matrix.size()-1,0,matrix[0].size()-1,ivec);
        return ivec;
    }
};

以上,通过啦,但性能一般。

全部评论

相关推荐

野猪不是猪🐗:是我导致的,我前天对力扣进行了跨站脚本攻击,网站把我的请求给block了(胡言乱语)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务