剑指offer-顺时针打印矩阵(数组)

题目描述

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

这题看似简单,就是分四个方向把矩阵输出了,但是!!!!

其实有一些隐藏的点,将矩阵分为三种情况:

1.类似{1}这种1*1的矩阵

2.行向量(只有一行的矩阵)以及列向量(只有一列的矩阵)

3.m*n的矩阵

例子给的4*4的矩阵比较好思考,就是

从左到右,从上到下,从右到左,以及从下到上。

刚开始只写了4*4矩阵的,后来遇到1.2两种情况的矩阵跑不通,最终借鉴了讨论里“上地”这位朋友的思路,

就是从左往右和从上到下,这两个方向是可以适用于1.2这两类矩阵的输出,输出一行或者一列

扫描二维码关注公众号,回复: 4484688 查看本文章

重点就在于两个if判断,如果top!=bottom,也就是说这个矩阵不止只有一行,那么才会有从右往左的这么一个输出,

如果不止只有一列,才会有从下到上的这样一个输出。

如果不加if判断,那对2.这种矩阵,会多输出一个数,因为for循环先输出一个数再判断条件。

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        int top=0,bottom=matrix.size()-1;//为行的上下限范围
        int left=0,right=matrix[0].size()-1; //列的上下限范围
        vector<int> res;
        int i,j;  //i是行的下标,j是列的下标
        while(top<=bottom&&left<=right){
            for(i=top,j=left;j<=right;j++) //从左往右
                res.push_back(matrix[i][j]);
            for(i=top+1,j=right;i<=bottom;i++) //从上往下
                res.push_back(matrix[i][j]);
            if(top!=bottom)  //如果不止一行,则有从右往左
                for(i=bottom,j=right-1;j>=left;j--)
                    res.push_back(matrix[i][j]);
            if(left!=right) //如果不止一列,则有从下往上
                for(i=bottom-1,j=left;i>top;i--)
                    res.push_back(matrix[i][j]);
            top++;left++;bottom--;right--;
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/Mr_xuexi/article/details/84348196