剑指offer--->顺时针打印矩阵

来源:互联网 发布:有道英语翻译软件下载 编辑:程序博客网 时间:2024/06/01 12:17

题目:
例如:如果输入如下矩阵:
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。

根据下图,对于矩阵我们可以进行一圈一圈的打印。
那么下面就是判断每次打印的条件:

这里写图片描述

下面分析打印一圈数据时需要注意的问题:

这里写图片描述

写代码时需要注意:

要一圈一圈的打印矩阵,那么就可以借助循环来做,至于循环的结束条件:
我们可以知道,一圈一圈打印矩阵时的左上角的下标为(start,start),x和y下标相等。

1、边界条件,千万不要重复打印
2.只有在rows > 2 * start && cols > 2 * start时,说明还没有打印到中间位置,所以可以继续打印。
3.需要特别注意每一步打印的条件。

#include<vector>class Solution {public:    //打印一圈:只要是打印一圈数据,那么左上角的x和y下标肯定会相等。    void PrintMatrixInCircle(vector<vector<int>>& matrix,vector<int>& res,int start)        {        int  rows = matrix.size();        if(rows < 1)            {            return ;        }        int cols = matrix[0].size();        int endX = rows - 1 - start;        int endY = cols - 1 - start;        //先打印第一步        int i = 0;        int j = 0;        for(i = start; i <= endY; ++i)            {            res.push_back(matrix[start][i]);                cout<< matrix[start][i]<<" ";            }        //判断是否需要打印第二步        if(endX > start)            {            for(j = start + 1; j <= endX; ++j)                {                res.push_back(matrix[j][endY]);                    cout<<matrix[j][endY]<<" ";                }        }        //判断是够需要打印第三步        if(endX > start && endY > start)            {            for(j = endY- 1; j >= start; --j)                {                res.push_back(matrix[endX][j]);                    cout<<matrix[endX][j]<<" ";            }        }        //判断是否需要打印第四步        if(endX - start >= 2 && endY > start)            {            for(i = endX - 1; i >  start; --i)                {                    cout<<matrix[i][start]<<" ";                    res.push_back(matrix[i][start]);                }        }    }    vector<int> printMatrix(vector<vector<int> > matrix)    {        vector<int> res;        res.clear();        int  rows = matrix.size();        if(rows < 1)            {            return res;        }        int cols = matrix[0].size();        int start = 0;        while(cols > start * 2 && rows > start * 2)            {            PrintMatrixInCircle(matrix,res,start);            ++start;        }        return res;    }};
原创粉丝点击