面试题20:顺时针打印矩阵

来源:互联网 发布:淘宝食品类别名称 编辑:程序博客网 时间:2024/05/16 11:26

      题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。

      这个问题之前在leecode上也碰到过,当时有人写了一种挺好的方法,借助于游戏设置上下左右的方法,具体有点不记得了。这道题看上去简单,但是写起来不容易,各种情况,开始很难考虑全,先写书上提到的方法吧。 

class Solution {public:    vector<int> printMatrix(vector<vector<int> > matrix) {        vector<int> vect;        if(matrix.size()==0)            return vect;        int rows=matrix.size();        int cols=matrix[0].size();                printMatrix1(vect,matrix,rows,cols);        return vect;    }    void printMatrix1(vector<int> &vect,vector<vector<int> > &matrix,int rows,int cols)    {        int start=0;        while(rows>2*start&&cols>start*2)        {            printMatrix2(vect,matrix,rows,cols,start);            start++;        }    }    void printMatrix2(vector<int> &vect,vector<vector<int> > &nums,int rows,int cols,int start)    {            int xmax=cols-1-start;        int ymax=rows-1-start;        int i,number;        for(i=start;i<=xmax;i++)        {                number=nums[start][i];            vect.push_back(number);        }        if(ymax>start)        {            for(i=start+1;i<=ymax;i++)            {                number=nums[i][xmax];                vect.push_back(number);            }        }        if(start<xmax&&start<ymax)        {            for(i=xmax-1;i>=start;i--)            {                number=nums[ymax][i];                vect.push_back(number);            }        }        if(start<xmax&&start<ymax-1)        {            for(i=ymax-1;i>start;i--)            {                number=nums[i][start];                vect.push_back(number);            }        }    }    };
          对于每次打印一圈,有必要说明一下。第一行肯定是要打印的。然后在最右边,从上往下打印的条件是终止行号大于起始行号(也就是至少两行),此时才从上往下打印。第三步是至少有两行两列,此时才能有返回行的打印。同理,第四步条件是终止行比起始行大2,同时终止列大于起始列。

0 0
原创粉丝点击