刷题 | 螺旋矩阵

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

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

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

全部评论

相关推荐

2024-12-31 11:16
已编辑
北京邮电大学 Java
KalznAsawind:标准的八股问烂简历,面试官碰到这种简历一般都会开始轰炸八股了。其实我一直觉得项目、实习的作用是将面试官困在你的语境中,在你的语境中跟他解释项目背景和细节,跟他battle,减少他轰炸你八股的时间,这样压力会小很多。但是你的项目是一眼无落地、无背景的包装项目,所以对方也不会去在意你的项目背景,只会针对你的项目涉及的技术栈开始轰炸八股,会增大你的压力,而你面试过不过全看你八股背的熟不熟。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务