考虑四种情况:
设m为有几横行,n为有几竖列,
第一种情况是m>n && n%2==1;
第二种情况是m>n && n%2==0;
第三种情况是m<=n %% m%2==1;
第四种情况是m<=n %% m%2==0;
分别算出每一中情况的终点[endx,endy]
每次找一下一个点,只需要记录当前的方向(右,下,左,上),还有当前属于第几层,抵拢倒拐,碰到终点返回。
public class Solution {
public static ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> rst_al=new ArrayList<Integer>();
int m=matrix.length;
if(m==0)
return rst_al;
int n=matrix[0].length;
rst_al=new ArrayList<Integer>(m*n);
//direction: 0left,1down, 2right,3up
int endx,endy;
if(m>n)
{
if(n%2==1)
{endx=m-1-n/2;endy=n/2;}
else
{endx=n/2;endy=n/2-1;}
}
else
{
if(m%2==1)
{endx=m/2;endy=n-1-m/2;}
else
{endx=m/2;endy=m/2-1;}
}
//System.out.println(endx+" : "+endy);
int layer=0,direction=0;
int i=0,j=0,k=0;
while(true)
{
//System.out.println(i+" : "+j);
rst_al.add(matrix[i][j]);
if(i==endx && j==endy)
break;
if(direction==0)
{
if(j==(n-1-layer))
{
i++;direction=1;
}
else
j++;
}
else if(direction==1)
{
if(i==(m-1-layer))
{
j--;direction=2;
}
else
i++;
}
else if(direction==2)
{
if(j==layer)
{
i--;direction=3;
}
else
j--;
}
else if(direction==3)
{
if(i==layer+1)
{
j++;direction=0;layer++;
}
else
i--;
}
}
return rst_al;
}
}