剑指OFFER 顺时针打印矩阵

Posted virgildevil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指OFFER 顺时针打印矩阵相关的知识,希望对你有一定的参考价值。

剑指OFFER 顺时针打印矩阵

试错

没想到这道题竟然花了这么长时间

先是用了递归,结果超时了

递归解

class Solution {
public:
    vector<int> res;
    void printSuround(vector<vector<int>> &m,int x,int y)
    {
        int size = m.size();
        if(m[x][y]==-1)return;
        while(x>=0 && y>=0 && x<size && y<size && m[x][y]!=-1)
        {
            res.push_back(m[x][y]);
            m[x][y]=-1;
            y++;
        }
        y--;
        x++;
        while(x>=0 && y>=0 && x<size && y<size && m[x][y]!=-1)
        {
            res.push_back(m[x][y]);
            m[x][y]=-1;
            x++;
        }
        x--;
        y--;
        while(x>=0 && y>=0 && x<size && y<size && m[x][y]!=-1)
        {
            res.push_back(m[x][y]);
            m[x][y]=-1;
            y--;
        }
        y++;
        x--;
        while(x>=0 && y>=0 && x<size && y<size && m[x][y]!=-1)
        {
            res.push_back(m[x][y]);
            m[x][y]=-1;
            x--;
        }
        x++;
        y++;
        printSuround(m,x,y);
    }

    vector<int> printMatrix(vector<vector<int>> matrix) {
        res.clear();
        if(matrix.size() == 0)return res;//如果矩阵空则返回一个空vector
        printSuround(matrix,0,0);
        return res;
    }
};

循环解

不使用递归,转换为循环,仍超时... 懵了

class Solution {
public:
    vector<int> res;
    pair<int,int> fac[4] = {{0,1},{1,0},{0,-1},{-1,0}};

    vector<int> printMatrix(vector<vector<int>> m) {
        res.clear();
        if(m.size() == 0)return res;//如果矩阵空则返回一个空vector
        if(m.size() == 1)
        {
            res.push_back(m[0][0]);
            return res;
        }
        int x = 0;
        int y = 0;
        int size = m.size();
        while(m[x][y] != -1)
        {
            for(int i=0;i<4;i++)
            {
                while(x>=0 && y>=0 && x<size && y<size && m[x][y] != -1)
                {
                    res.push_back(m[x][y]);
                    m[x][y] = -1;
                    x += fac[i].first;
                    y += fac[i].second;
                }
                x -= fac[i].first;
                y -= fac[i].second;
                x += fac[(i+1)%4].first;
                y += fac[(i+1)%4].second;
            }
        }
        return res;
    }
};

现在还没弄明白是哪个步骤这么耗时,复杂度应该是差不多,先放这,以后弄明了再补充

题解

实在顶不住了,屈辱地抄下大神的代码

class Solution {
public:
    vector<int> printMatrix(vector<vector<int>> matrix) {
        int row=matrix.size();
        int col=matrix[0].size();
        vector<int> result;
        if(row==0||col==0)
            return result;
        int left=0,right=col-1,top=0,btm=row-1;
        while(left<=right&&top<=btm)
            {
            for(int i=left;i<=right;i++)
                result.push_back(matrix[top][i]);
            if(top<btm)
                for(int i=top+1;i<=btm;i++)
                    result.push_back(matrix[i][right]);
            if(top<btm&&left<right)
                for(int i=right-1;i>=left;i--)
                    result.push_back(matrix[btm][i]);
            if(top+1<btm&&left<right)
                for(int i=btm-1;i>=top+1;i--)
                    result.push_back(matrix[i][left]);
            left++;right--;top++;btm--;
        }
        return result;
    }
};

以上是关于剑指OFFER 顺时针打印矩阵的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 29. 顺时针打印矩阵 的 详细题解

剑指offer面试题 29. 顺时针打印矩阵

剑指offer面试题 29. 顺时针打印矩阵

剑指offer:顺时针打印矩阵

剑指offer 19.顺时针打印矩阵

Java 剑指offer(29) 顺时针打印矩阵