题目要求:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
我们可以将一个复杂的问题简单化,我们可以将它理解为是由从外圈到内圈的顺序依次打印的,所以我们可以把矩阵当作若干个圈。我们可以用一个循环来打印矩阵,每次打印矩阵中的一个圈。
接下来我们要分析一下循环结束的条件。每个圈的开始位置的坐标都是相等的(start,start).第一圈为(0,0),第二圈为(1,1)…假设矩阵的行数为rows,列数是columns,我们会发现,开始位置的坐标与行数的关系,rows>2start&&columns>2start.所以就可以得出循环的中止条件。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer>list=new ArrayList<>();
int start=0;
//循环的中止条件matrix.length>2*start&&matrix[0].length>2*start
while (matrix.length>2*start&&matrix[0].length>2*start){
//每个圈都给一个开始坐标与一个最大坐标,从而确定边界范围
printMatrix(matrix,start,start,matrix.length-1-start,matrix[0].length-1-start,list);
start++;
}
return list;
}
private void printMatrix(int[][]matrix,int startx,int starty,int endx,int endy,ArrayList list){
//当数组为一维数组的时候
if (matrix.length==1&&matrix[0].length>=2){
for (int i = starty; i <= endy; i++) {
list.add(matrix[startx][i]);
}
}else if (matrix[0].length==1&&matrix.length>=2){
for (int i=startx;i<=endx;i++){
list.add(matrix[i][0]);
}
}else{
//打印从左往右行
for (int i = starty; i <= endy; i++) {
list.add(matrix[startx][i]);
}
//打印从上到下列
for (int i = startx + 1; i <= endx; i++) {
list.add(matrix[i][endy]);
}
if (startx!=endx){
//打印从右往左的行
//当开始位置点和最大点不在一条直线时才执行,不如会出现重复元素
for (int i = endy - 1; i >= starty; i--) {
list.add(matrix[endx][i]);
}
}
//打印从下往上的行
for (int i = endx - 1; i > startx; i--) {
list.add(matrix[i][starty]);
}
}
}
}