整个的循环过程可以分解成多个小过程来解决。
可以拿一个9*10的矩阵来举例子:
rowSize=9; colSize=10;
具体可以分解为多少个环(过程)呢,取决于rowSize 和 colSize 的大小关系:
Pos = rowSize > colSize ? (colSize - 1) / 2 : (rowSize - 1) / 2;
Pos 代表共有多少个环(注:从0开始算)
从图中可以看出,第n个环的起始位置都是[n,n],n 最大为Pos。
将每个环的边界搞清楚之后就可以写出一个大循环,大循环过程中有4个小循环:
for (int i = 0; i <= Pos; i++) { for() ...; // 左上->右上 for() ...; // 右上->右下 for() ...; // 右下->左下 for() ...; // 左下->左上 }
接下来判断特殊情况:严格意义上来说,像图中的9 * 10矩阵所描述的最后一“环”一样,他只是个横线,当然也会出现竖线。
横线和竖线的出现会导致重复打印。一条横线和竖线往往使用2 个小循环:左上->右上,右上->右下 就可以全部打印完。后面2 个小循环会重复打印,因此,后2 个小循环要加条件,避免重复。
最终代码如下:
vector<int> printMatrix(vector<vector<int> > matrix) { int rowSize = matrix.size(); int colSize = matrix[0].size(); vector<int> Temp; int Pos = rowSize > colSize ? (colSize - 1) / 2 : (rowSize - 1) / 2; for (int i = 0; i <= Pos; i++) { for (int c = i; c <= colSize - 1 - i; c++) Temp.push_back(matrix[i][c]); for (int r = i + 1; r <= rowSize - 1 - i; r++) Temp.push_back(matrix[r][colSize - 1 - i]); if (i != rowSize - 1 - i && i != colSize - 1 - i) { // 添加判断条件:最后一环为单行或单列的情况下,不重复打印 for (int c = colSize - 2 - i; c >= i; c--) Temp.push_back(matrix[rowSize - 1 - i][c]); for (int r = rowSize - 2 - i; r > i; r--) Temp.push_back(matrix[r][i]); } } return Temp; }