leetcode: Spiral Matrix

考虑四种情况:


设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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值