题目描述:
题目描述:输入一个矩阵,按照从外向里以顺时针打印出每一个数字,例如:输入如下矩阵,则依次打印出的数字为: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;
}
};