还记得前两天第一次做这个的时候真是打击了自己,没有什么好办法主要是考虑边界问题,顺着打,避免重复就可以了。
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;
}
京公网安备 11010502036488号