天天看点

剑指Offer(牛客版)--面试题29:顺时针打印矩阵

剑指Offer(牛客版)--面试题29:顺时针打印矩阵

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

分析;

剑指Offer(牛客版)--面试题29:顺时针打印矩阵

完整代码:

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        //获取矩阵的行列数
        int rows = matrix.size();
        int cols = matrix[0].size();
        //定义临时vector
        vector<int> array;
        //检查输入的合法性
        if(matrix.empty()|| rows<=0 || cols<=0)
            return array;
        //定义起始点
        int start = 0;
        //结束循环的条件:当矩阵打印完毕时,起始点的坐标会超出行列长的的一半
        while(rows > start *2 && cols > start *2)
        {
            /*******输出顺时针圈********/
            //计算圈的右下角坐标
            int EndX = cols - start -1;
            int EndY = rows - start -1;
            //从左到右,打印一行
            //从左上角的起点开始
            for(int i = start; i<=EndX; ++i)
            {
                //其特点是行不变,列在变
                int number = matrix[start][i];
                array.push_back(number);
            }
            //从上到下,打印一列
            //判断起点在边界内
            if(start < EndY)
            {
               //起点的行坐标往下走一步
               for(int i = start + 1; i<=EndY; ++i)
               {
                   //其特点是行在变,而列不变
                   int number = matrix[i][EndX];
                   array.push_back(number);
               } 
            }
            //从右到左,打印一行
            //判断此时的起点在边界内
            if(start < EndX && start < EndY)
            {
               //起点的列坐标往左走一步
               for(int i = EndX-1; i>= start; --i)
               {
                  //其特点是行不变而列在变
                  int number = matrix[EndY][i];
                  array.push_back(number);
               }
            }
            //从下到上,打印一列
            if(start < EndX && start < EndY-1)
            {
               //起点的行坐标往上走一步,终止点往下走一步
               for(int i = EndY-1; i>=start+1; --i)
               {
                  int number = matrix[i][start];
                  array.push_back(number);
               }
            }
            //起始点往右下移动一位
            ++start;
        }
        //返回打印出来的数值
        return array;
    }
};