题目链接
题目描述
按顺时针的方向,从外到里打印矩阵的值。下图的矩阵打印结果为: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){
// top
for(int i=left;i<=right;i++){
res.add(matrix[top][i]);
}
top++;
// right
for(int i=top;i<=bottom;i++){
res.add(matrix[i][right]);
}
right--;
//bottom
for(int i=right;i>=left;i--){
res.add(matrix[bottom][i]);
}
bottom--;
//left
for(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;
}
}
代码分析
注意代码中注释中书写