Leecode刷题笔记——54. 螺旋矩阵

在这里插入图片描述
思路如下:
1、可以看到,遍历的方向是右→下→左→上→右…方向的变化是有规律的,因此我们可以使用两个分别表示x、y方向的数组来定义遍历的方向
2、可以发现,在遇到边界,或者是遇到已经遍历过的数的时候,就会改变方向,因此再定义一个布尔数组表示当前坐标是否已经遍历过

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer>list=new ArrayList<>();
        if(matrix.length==0){
            return list; 
        }
        int R = matrix.length;
        int C = matrix[0].length;
        //dr数组表示y方向的数组,dc表示x方向的数组
        int []dr = {0,1,0,-1};
        int []dc = {1,0,-1,0};
        //r、c表示下标,direction表示转向的累积数
        int r=0,c=0,direction=0;        
        //定义布尔数组判断当前坐标是否已经遍历过
        boolean[][] bool_matrix=new boolean[R][C];
        for(int i=0;i<R*C;i++){
            list.add(matrix[r][c]);
            /true表示已经遍历过
            bool_matrix[r][c]=true;
            //r、c在direction方向上往前走一位
            int nr=r+dr[direction];
            int nc=c+dc[direction];
            //如果未超出边界且是碰到的下一个数没有遍历过,就在当前方向上继续走
            if(nr>=0&&nr<R&&nc>=0&&nc<C&&!bool_matrix[nr][nc]){
                r=nr;
                c=nc;
            }
            else{
            	//否则要改变方向
                direction=(direction+1)%4;
                //r、c在改变方向后遍历到下一位
                r=r+dr[direction];
                c=c+dc[direction];
            }
        }
        return list;
    }
}

原题地址:
54. 螺旋矩阵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值