题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
题解:
题目类型蛇形填数,在一个矩阵中瞬时间遍历,只需要控制好边界以及数是不是已经遍历过,采用一个新的二维数组的矩阵,记录是否被遍历过,然后控制好边界,先向右,再向下,再向左,在向右。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> arrayList = new ArrayList<>();
int length = matrix.length;
if (length != 0) {
//定义一个二维数组,存储当前位置的数是不是被遍历过
boolean[][] flag = new boolean[length][matrix[0].length];
//将第一个元素放入数组中,并标记当前位置的元素已遍历
flag[0][0] = true;
arrayList.add(matrix[0][0]);
int i = 0;
int j = 0;
//统计元素的个数
int count = 0;
while (count < length * matrix[0].length - 1) {
//往右的下一个节点会不会越界,有没有遍历过
while (j + 1 < matrix[0].length && !flag[i][j + 1]) {
//没有,则将数据放入到集合中
arrayList.add(matrix[i][++j]);
flag[i][j] = true;
count++;
}
//往下
while (i + 1 < length && !flag[i + 1][j]) {
arrayList.add(matrix[++i][j]);
flag[i][j] = true;
count++;
}
//往左
while (j - 1 >= 0 && !flag[i][j - 1]) {
arrayList.add(matrix[i][--j]);
flag[i][j] = true;
count++;
}
//往上
while (i - 1 >= 0 && !flag[i - 1][j]) {
arrayList.add(matrix[--i][j]);
flag[i][j] = true;
count++;
}
}
}
return arrayList;
}
}