还记得前两天第一次做这个的时候真是打击了自己,没有什么好办法主要是考虑边界问题,顺着打,避免重复就可以了。
public ArrayList<Integer> spiralOrder(int[][] matrix) { ArrayList<Integer> res=new ArrayList<>(); if(matrix==null || matrix.length==0){ return res; } int m=matrix.length; int n=matrix[0].length; int x=0; int y=0; int tmp=0; //记录圈数,用来定位每一圈的上下左右的边界 while(res.size()<m*n){ //控制退出 while(y<n-tmp && res.size()<m*n){ //边界控制,同时在过程中有可能打印结束 res.add(matrix[x][y]); y++; } y--;//最后一个y是超标了的要吐出来, x+=1;//把位置下移一个,到这里的 x,y组成新的坐标作为下一轮的起点,防止重复加入上一轮的最后一个元素 while(x<m-tmp && res.size()<m*n ){ res.add(matrix[x][y]); x++; } x--; y-=1; while(y>=0+tmp && res.size()<m*n){ res.add(matrix[x][y]); y--; } y++; x-=1; while(x>=1+tmp && res.size()<m*n){//注意这里的 x条件 res.add(matrix[x][y]); x--; } x++;//归位到本来的位置 tmp++;//一圈打完了就再来一圈 y++;//下移 } return res; }