《剑指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;
}
};