1.本题知识点
矩阵
2. 题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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。
3. 思路
① 把矩阵看成由若干个顺时针方向的圈组成。先打印外面的圈,再打印里面的圈。
② 循环打印的条件:rows > startX * 2 且 cols > startY * 2。 rows为矩阵行数,cols为矩阵列数。startX为起始点X坐标,startY为起始点Y坐标。
③ 打印一个圈如何实现?如图,分为四部分:从左到右打印,从上到下打印,从右到左打印,从下到上打印。
④ 单圈打印的特殊情况。一个圈可能只有三步、两步、一步。所以要考虑到。
分析特殊情况:第一步肯定需要,因为打印一个圈至少需要一步;第二步执行的前提条件就是终止行号需大于起始行号;第三步执行的前提条件是至少有2行2列;第四部执行的前提条件是至少有3行2列。
⑤ 总结:需要2个方法,多个圈循环的控制方法和 单个圈打印的方法,并考虑特殊情况。
Java 循环版:
import java.util.ArrayList;
public class Solution {
private ArrayList<Integer> result = new ArrayList<>();
public ArrayList<Integer> printMatrix(int [][] matrix) {
if(matrix == null) return null;
int rows = matrix.length;
int cols = matrix[0].length;
int start = 0;
while(rows > start * 2 && cols > start * 2){
printSingleCircle(matrix, rows, cols, start);
++start;
}
return result;
}
void printSingleCircle(int [][] matrix,int rows, int cols, int start){
int endCol = cols - 1 - start;
int endRow = rows - 1 - start;
for(int i = start ; i <= endCol; ++i){
result.add(matrix[start][i]);
}
if(endRow > start)
{
for(int i = start + 1 ; i <= endRow; ++i){
result.add(matrix[i][endCol]);
}
}
if(start < endCol && start < endRow )
{
for(int i = endCol - 1; i >= start; --i){
result.add(matrix[endRow][i]);
}
}
if(start < endCol && start < endRow - 1 )
{
for(int i = endRow - 1; i >= start+1; --i){
result.add(matrix[i][start]);
}
}
}
}