题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: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。
思路分析:
1、首先需要判断一下矩阵是否为空;
2、从左上角开始,按照由外向里顺时针画圈的方式遍历矩阵,从下图可以看出每个圈的起始位置的坐标都是(0,0)、(1,1)。。。首先根据下图判断循环的终止条件:
3、每次计算完一个圈之后,start++,来计算下一个圈。
4、对于打印有四种情况:从左到右,从上到下,从右到左,从下到上,下面分别来分析每一种情况:
从左到右:从每个圈的左上角的位置为起始位置,到本行结束endY;
从上到下:首先要保证至少有两行数据,也就是start<endX,然后从start+1行开始到最后一行;
从右到左:要保证至少有两行两列,然后从endY-1开始到start;
从下到上:至少要是三行两列,从endX-1开始到start-1;
5、使用list的addAll()函数,将PrintMaxtrixCircle中的list值赋值给printMatrix中的list。
代码如下:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
if(matrix==null){//矩阵为空
return null;
}
int row=matrix.length;//获得矩阵的行数
int col=matrix[0].length;//获得矩阵的列数
int start=0;//每一圈起始的位置
ArrayList<Integer> list=new ArrayList<Integer>();
while(row>2*start&&col>2*start){//循环终止的条件
list.addAll(PrintMaxtrixCircle(matrix,col,row,start));//如果满足条件,就打印
start++;//开始循环下一个圈
}
return list;
}
public ArrayList<Integer> PrintMaxtrixCircle(int[][] matrix,int col,int row,int start){
int endX=row-1-start;//行数的结束位置
int endY=col-1-start;//列数的结束位置
ArrayList<Integer> list=new ArrayList<Integer>();
//从左到右打印1行
int number;
for(int i=start;i<=endY;i++){
number=matrix[start][i];
list.add(number);
}
//从上到下打印列,至少要有两列
if(endX>start){
for(int i=start+1;i<=endX;i++){
number=matrix[i][endY];
list.add(number);
}
}
//从右到左打印,至少要有两行两列
if(start<endX&&start<endY){
for(int i=endY-1;i>=start;i--){
number=matrix[endX][i];
list.add(number);
}
}
//从下到上打印,至少要是三行两列
if(start<endX-1&&start<endY){
for(int i=endX-1;i>start;i--){
number=matrix[i][start];
list.add(number);
}
}
return list;
}
}