题目链接
题目描述
按顺时针的方向,从外到里打印矩阵的值。下图的矩阵打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10

解题思路
一层一层从外到里打印,观察可知每一层打印都有相同的处理步骤,唯一不同的是上下左右的边界不同了。因此使用四个变量 r1, r2, c1, c2 分别存储上下左右边界值,从而定义当前最外层。打印当前最外层的顺序:从左到右打印最上一行->从上到下打印最右一行->从右到左打印最下一行->从下到上打印最左一行。应当注意只有在 r1 != r2 时才打印最下一行,也就是在当前最外层的行数大于 1 时才打印最下一行,这是因为当前最外层只有一行时,继续打印最下一行,会导致重复打印。打印最左一行也要做同样处理。

import java.util.ArrayList;public class Solution {public ArrayList<Integer> printMatrix(int [][] matrix) {ArrayList<Integer> res = new ArrayList<Integer>();int top=0,bottom=matrix.length-1;int left=0,right=matrix[0].length-1;if(matrix.length == 0 || matrix[0].length==0){return res;}// 输入数组只有一行if(matrix.length == 1){for(int i=left;i<=right;i++){res.add(matrix[top][i]);}return res;}// 输入数组只有一列if(matrix[0].length == 1){for(int i=top;i<=bottom;i++){res.add(matrix[i][left]);}return res;}while(top<=bottom&&left<=right){// topfor(int i=left;i<=right;i++){res.add(matrix[top][i]);}top++;// rightfor(int i=top;i<=bottom;i++){res.add(matrix[i][right]);}right--;//bottomfor(int i=right;i>=left;i--){res.add(matrix[bottom][i]);}bottom--;//leftfor(int i=bottom;i>=top;i--){res.add(matrix[i][left]);}left++;// 当top==bottom时,意味着循环到了最中间的一个行// 而不是只有一行,如果传入的数组本身只有一行的话,在while循环外就会被过滤掉if(top==bottom){for(int i=left;i<=right;i++){res.add(matrix[top][i]);}break;}// 道理同上if(left==right){for(int i=top;i<=bottom;i++){res.add(matrix[i][left]);}break;}}return res;}}
代码分析
注意代码中注释中书写
