18、顺时针打印矩阵

题目描述:

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

在这里插入图片描述

解题思路:

  把矩阵看成由若干个顺时针方向的圈组成,循环打印矩阵中的每个圈,每次循环打印一个圈。打印一圈通常分为四步,第一步从左到右打印一行;第二步从上到下打印一列;第三步从右到左打印一行;第四步从下到上打印一列设置四个变量left,right,top,btm,用于表示圈的方位,每一步根据起始坐标和终止坐标循环打印。
在这里插入图片描述

【Note】:最后一圈有可能不需要四步,有可能只有一行,只有一列,只有一个数字,因此我们要仔细分析打印每一步的前提条件:

1. 打印第一步,第一步总是需要的。

在这里插入图片描述

2. 打印第二步的前提条件是(top+1 < bottom)。

在这里插入图片描述

3. 打印第三步的前提条件是(right - 1 > left && bottom > top)。

在这里插入图片描述

4. 打印第四步的前提条件是(bottom - 1 > top && right > left)。

在这里插入图片描述

Demo

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> vec;
        int row = matrix.size();
        int col = matrix[0].size();
        if (row == 0 || col == 0)  return vec;
        int left = 0, right = col-1, top = 0, bottom = row - 1;
        while (left <= right && top <= bottom)
        {
            // 从左到右打印
            for (int i = left; i <= right; ++i)
                vec.push_back(matrix[top][i]);
            // 从上到下打印
            for (int i = top + 1; i <= bottom; ++i)
                vec.push_back(matrix[i][right]);
            // 从右到左打印,注意:如果最后一圈是一行,则必须判断下bottom是否大于top,否则会重复打印
            for (int i = right - 1; i >= left && bottom > top; --i)
                vec.push_back(matrix[bottom][i]);
            // 从下到上打印,注意:如果最后一圈是一列,则必须判断下right是否大于left,否则会重复打印
            for (int i = bottom - 1; i > top && right > left; --i)
                vec.push_back(matrix[i][left]);
            // 左上递增,右下递减
            left++; top++; right--; bottom--;
        }
        return vec;
    }
};

猜你喜欢

转载自blog.csdn.net/daaikuaichuan/article/details/85028774