方法一:定义边界:防止溢出或者重复打印
public List<Integer> spiralOrder(int[][] matrix) { List<Integer> list=new ArrayList(); if(matrix.length==0) return list; int a=0, b=matrix[0].length-1, c=0, d=matrix.length-1; while(a<=b&&c<=d){ //边界 ,下面的for里面边界防止多次打印或溢出 for(int i=a;i<=b;i++) //左到右 list.add(matrix[c][i]); c++; //一行打印完后进入下一行 for(int i=c;i<=d&&c<=d;i++) //上到下 list.add(matrix[i][b]); b--; //缩小列边界 for(int i=b;i>=a&&a<=b&&c<=d;i--) //下面的右到左 list.add(matrix[d][i]); d--; //缩小行边界 for(int i=d;i>=c&&a<=b&&c<=d;i--) //下到上 list.add(matrix[i][a]); a++; //进入下一列 } return list; }
方法二:针对左上角是每一圈的起始位置 从(0,0)(1,1)(2,2)等开始
public List<Integer> spiralOrder(int[][] matrix) { List<Integer> list=new ArrayList(); if(matrix==null || matrix.length<=0 || matrix[0].length<=0) return list; int start=0; int columns=matrix[0].length;//列 int row= matrix.length;//行 while(columns>(start<<1) && row>(start<<1)){ int end_c=columns-1-start; int end_r=row-1-start; //左到右 for(int i=start;i<=end_c;i++) list.add(matrix[start][i]); //上到下 if(start<end_r) for(int i=start+1;i<=end_r;i++) list.add(matrix[i][end_c]); //右到左 if(start<end_c&&start<end_r) for(int i=end_c-1;i>=start;--i) list.add(matrix[end_r][i]); //下到上 if(start<end_c&&start<end_r-1) for(int i=end_r-1;i>=start+1;--i) list.add(matrix[i][start]); start++; } return list; }