《剑指offer》顺时针打印矩阵

一、题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.

二、输入描述

输入一个矩阵

三、输出描述

按顺时针的顺序依次打印出每一个数字

例如:
输入: 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.

四、牛客网提供的框架

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {

    }
};

五、解题思路

这里写图片描述

如上图,从外围开始,每一次把外围的遍历完。一共需要遍历的圈数为矩阵的长度除以2向上取整。

每一圈又四个操作,第一步是长方向的上面,从左到右;第二步是右边,从上到下;第三步是下面,从右到左;第四步是左边,从下到上。

蓝色的为第一次(遍历第一圈),黄色为第二次遍历。

开始以为这道题这样就能解决了。后来发现原来题目给的不一定是方阵,即长跟宽不一定相等。

这个时候有两个地方需要修改,

第一:圈数取ceil((double)row / 2与ceil((double)col / 2)的最小值。

第二:要处理两个不一样大小时导致重复遍历的问题。

六、代码

class Solution {
public:
    vector<int> printMatrix(vector<vector<int>> matrix) {
        int row = matrix.size();
        int col = matrix[0].size();
        int leng = min(ceil((double)row / 2), ceil((double)col / 2));
        vector<int> mt;

        for(int i = 0; i < leng; i++)
        {
            int r = i;
            int c = i;

            for(c = i;c < col - i; c++) //上面从左到右
                mt.push_back(matrix[r][c]);

            for(r = i + 1; r < row - i; r++)    //右边从上到下
                mt.push_back(matrix[r][col - i - 1]);

            for(c = col - i - 2; c >= i && (row - i - 1 != i); c--)     //下面从右到左
                mt.push_back(matrix[row - i - 1][c]);

            for(r = row - i - 2; r >= i+ 1 &&(col - i - 1 != i); r--)      //左边从下到上
                mt.push_back(matrix[r][i]);

        }
        return mt;
    }
};
posted @ 2016-06-30 00:36  chenximcm  阅读(201)  评论(0编辑  收藏  举报