这个算法算了好久,不是有多难,而是太乱了。如果我不解释的话,相信你也是看不懂我定义的变量到底要干嘛的。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
//定义了矩阵的长宽
int length = matrix.length;
int length2= matrix[0].length;
//ii的意思是第ii行或第length-ii-1行已经走过了,当走到这的时候拐弯。jj同理;
int ii = 0;
int jj = 0;
//这里我定义的两个变量告诉他们iii是可以横着走,jjj是可以竖着走。
boolean iii = true;
boolean jjj = false;
//定义循环次数。因为这里定义的循环没有自增和自减,需要在循环体里面做,需要计算次数。
int count = length*length2+1;
//定义一个arrayList来存放数据,这里为什么不用int[][]数组呢,因为当你找到数据想添加的时候发现这里的i,j是顺时针变化的,不是逐步递增的,
ArrayList<Integer> al = new ArrayList<Integer>();
//当数组只有一个数组时:
if(length==1&&length2==1){al.add(matrix[0][0]); return al;}
// if(length==2&&length2==2){al.add(matrix[0][0]);al.add(matrix[0][1]);al.add(matrix[1][1]);al.add(matrix[1][0]); return al; }
for(int i = 0 ; i <length; )
{
for(int j = 0 ; j< length2;)
{
count--;
if(count <=0){return al;}
al.add(matrix[i][j]);
//先add再“走路”:
//判断是不是横着走,如果在第ii行向右走,下同
if(i==ii&&iii) {
//如果走到头了,掉头,下同
if(j!=length2-jj-1){j++;}
else {i++;iii = false;jjj =true;}
}
//同理是不是竖着走,如果是在第length-jj-1列,就向下走,下同
else if(jjj&&j==length2 - jj-1)
{
//走到头了就拐弯,下同
if(i!=length-ii-1)
{
i++;
}
else{j--;iii=true;jjj=false;}
}
else if(iii&&i==length-ii-1)
{
if(j!=jj){j--;}
else {ii++;i--;iii=false;jjj=true; }
}
else if(jjj&&j==jj)
{
if(i!=ii){i--;}
else {jj++;j++;jjj=false;iii=true;}
}
}
}
return al;
}
}