题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
/*
*思路:矩阵从外向里顺时针打印,可以分解成从(0,0)开始顺时针遍历最外层,然后从(1,1)开始顺时针遍历第二层,依次向里
*在遍历某一层的时候需要知道这几个信息:遍历起点,该层的行数和列数(行数列数用来确定执行for循环遍历时的条件)
*遍历的时候需要注意当最内层是只有一行或者一列的情况
* 原矩阵 第一层 第二层
* 1 2 3 4 1 2 3 4
* 2 3 4 5 2 5 3 4
* 1 6 5 6 1 6 6 5
* 0 9 8 7 0 9 8 7
*
*/
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> arrayList = new ArrayList<>();
printMatrixHelper(matrix, 0, 0, matrix.length, matrix[0].length, arrayList);
return arrayList;
}
//遍历函数,matrix为原矩阵,(m,n)是遍历起点,rows,cols分别为该层行数和列数,arrayList存储遍历结果
private void printMatrixHelper(int[][] matrix, int m, int n, int rows, int cols, ArrayList<Integer> arrayList){
if(rows <= 0 || cols <= 0) //递归出口,当rows或cols小于等于0时遍历结束
return;
int i = 0, j = 1; //i,j分别用来控制水平方向上和竖直方向上的for循环条件()
//首先从起点开始向右遍历直到该行遍历结束,如下
// 1 2 3 4 1 2 3 4
// 2 5 ---》
// 1 6
// 0 9 8 7
for(; i < cols; i++)
arrayList.add(matrix[m][n+i]);
i--; //这里注意for循环执行完毕之后i多加了一次,即for循环完毕后i==cols,需要将i--
//接着从(m, n + cols - 1)这个点开始向下遍历(也就是例子里值为4这个点)遍历结束后如下
// 1 2 3 4
// 5
// 6
// 7
//这里注意(m,n + cols - 1)这个点(例子里的4这个点)不要重复遍历了,所以j从1开始
for(; j < rows; j++)
arrayList.add(matrix[m+j][n+cols-1]);
j--; //同i
//当该层不是一行或者一列的时候,需要遍历该层下方和左方
if(cols > 1 && rows > 1){
//该层下方从点(m + rows - 1,n + i)开始向左遍历(例子里7这个点)
// 1 2 3 4
// 5
// 6
// 0 9 8 7
//同样注意不要重复遍历
for(; i > 0; i--)
arrayList.add(matrix[m+rows-1][n+i-1]);
//从点(m + j, n)向上遍历(例子里的0)
// 1 2 3 4
// 2 5
// 1 6
// 0 9 8 7
//同样注意不要重复遍历,这里多注意一点,起点(m,n)一开始已经遍历过所以j>1
for(; j > 1; j--)
arrayList.add(matrix[m+j-1][n]);
}
printMatrixHelper(matrix, m + 1, n + 1, rows - 2, cols - 2, arrayList); //递归遍历向里的一层
}
}