思路:首先可以明确需要输出多少个数是知道的。也就是行数*列数。
我的思路是定义四种状态,上下左右。同时定义四个边界。让一个指针在边界围成的空间中按照四种状态移动。每次移动到边界,改变其状态,同时移动边界。直到输出结束。
思路和代码都比较简单
另外还可以使用画框的方式:大框走一圈,把边界往中间移一圈。此时开始的坐标为原坐标的右下位置。同样也需要有边界限制。可以通过判断起点是否位于边界之外判断是否循环结束。
class Solution {
public int[] spiralOrder(int[][] matrix) {
int[] arr={};
if(matrix==null||matrix.length==0||matrix[0].length==0){
return arr;
}
int right=matrix[0].length-1;
int left = 0;
int up = 0;
int down = matrix.length-1;
int num = matrix.length*matrix[0].length;
int row=0;
int colum=0;
arr = new int[num];
int index=0;
char char1 ='r';
for(int i =0 ; i<num;i++){
//循环
switch(char1){
case 'r' :{
if(colum>=right){
arr[index++]=matrix[row][colum];
up++;
row++;
char1='d';
break;
}else{
arr[index++]=matrix[row][colum];
colum++;
break;
}
}
case 'd':{
if(row>=down){
arr[index++]=matrix[row][colum];
right--;
char1='l';
colum--;
break;
}else{
arr[index++]=matrix[row][colum];
row++;
break;
}
}
case 'l':{
if(colum<=left){
arr[index++]=matrix[row][colum];
down--;
char1='u';
row--;
break;
}else{
arr[index++]=matrix[row][colum];
colum--;
break;
}
}
case 'u':{
if(row<=up){
arr[index++]=matrix[row][colum];
left++;
colum++;
char1='r';
break;
}else{
arr[index++]=matrix[row][colum];
row--;
break;
}
}
}
}
return arr;
}
}