题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例子:
如果输入如下矩阵: 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.
链接:
剑指Offer(第2版):P161
思路标签:
- 绘图寻找规律
解答:
1. C++
- 将矩阵看作若干个圈组成,每次从外向内依次打印矩阵中的圈;
- 一般来说,每个圈需要四步:第一步从左到右,第二步从上到下,第三步从右到左,第四步从下到上;
- 但是最后一个圈可能出现退化,变成只有两行,或者一行,或者一列,或者只有一个数字。
- 每个圈的起始点为:(start,start),且循环条件为:
columns>start*2
并且rows>start*2
; - 每个圈中,第一步总是需要的;第二步需要终止行号大于起始行号;第三步需要终止行号大于起始行号,终止列号大于起始列号;第三步需要终止行号比起始行号大2个,同时终止列号大于起始列号。
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> retNumber;
if(matrix.empty()) return retNumber;
int start = 0;
int rows = matrix.size();
int columns = matrix[0].size();
while(columns > start*2 && rows > start*2){
int endX = columns - 1 - start;
int endY = rows - 1 - start;
// 从左到右打印一行
for(int i=start; i<=endX; ++i){
int number = matrix[start][i];
retNumber.push_back(number);
}
// 从上到下打印一列
if(start<endY){
for(int i=start+1; i<=endY; ++i){
int number = matrix[i][endX];
retNumber.push_back(number);
}
}
// 从右到左打印一行
if(start<endX && start<endY){
for(int i=endX-1; i>=start; --i){
int number = matrix[endY][i];
retNumber.push_back(number);
}
}
// 从下到上打印一列
if(start<endX && start<endY-1){
for(int i=endY-1; i>=start+1; --i){
int number = matrix[i][start];
retNumber.push_back(number);
}
}
++start;
}
return retNumber;
}
};