问题分析:
这道题我想的是第一步从左到右、第二步从上到下、第三步从右到左、第四步从下到上,然后再重复上面的步骤。
import java.util.ArrayList;
public class Solution {
public ArrayList<integer> printMatrix(int [][] matrix) {
ArrayList<integer> result=new ArrayList<integer>();
int row=matrix.length;//定义数组的行数
int col=matrix[0].length;//定义数组的列数
//定义数组的上下左右的边界
int up=0,down=row-1,left=0,right=col-1;
if(row==0||col==0) {
return result;
}
//所有的操作都是在左边界小于等于右边界并且上边界小于等于下边界的前提下的
while(up<=down&&left<=right) {
//顺时针的话,先是从左到右进行遍历,遍历结束后更新上届的值
for(int i=left;i<=right;i++) {
result.add(matrix[up][i]);
}
up++;
//从上到下进行遍历,遍历结束后更新右边界的值
for(int i=up;i<=down;i++) {
result.add(matrix[i][right]);
}
right--;
//然后从右到左进行遍历,这里的话我们需要先判断上下界的关系,避免重复遍历从左到右的元素
if(up<=down) {
for(int i=right;i>=left;i--) {
result.add(matrix[down][i]);
}
down--;
}
//最后一步就是从下到上遍历,同样需要判断左右界的关系,避免重复遍历第二步从上到下的元素
if(left<=right) {
for(int i=down;i>=up;i--) {
result.add(matrix[i][left]);
}
left++;
}
}
return result;
}
}
不过我在讨论区看到了一个更加厉害的方法,就是旋转魔法:将矩阵看成一个魔方,
每次读完第一行,就将第一行删掉,之后将数组逆时针旋转90度。下面是一个博主写的代码,大家可以借鉴一下:
链接:https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a?f=discussion
来源:牛客网</integer></integer></integer>

import java.util.ArrayList;
public class Solution {
public ArrayList<integer> printMatrix(int [][] matrix) {
//作为存放结果的容器
ArrayList<integer> list = new ArrayList<>();
//拿到出事数组的行数
int row = matrix.length;
while(row != 0){
//将数组的第一行先添加进容器中
for(int i=0;i<matrix[0].length;i++)
list.add(matrix[0][i]);
//当行数等于1时就没有必要再继续执行了,在上面打印完之后就可以停止了
if(row == 1) break;
//删除上面遍历的数组的第一行,然后旋转这个数组并返回
matrix = revert(matrix);
//更新行数
row = matrix.length;
}
//返回
return list;
}
private int[][] revert(int[][] matrix){
//拿到matrix的行数和列数
int rows = matrix.length;
int cols = matrix[0].length;
//因为我们要将原数组遍历过的第一行删除,然后旋转变成一个新的数组,所以先初始化一下这个新数组
int[][] newMatrix = new int[cols][rows-1];
//对这个新数组进行赋值
for(int j=cols-1;j>=0;j--){
for(int i=1;i<rows;i++){
newMatrix[cols-j-1][i-1] = matrix[i][j];
}
}
//返回新数组
return newMatrix;
}
}</integer></integer>