28.顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

数据范围:

矩阵中元素数量 [0,400]。

样例:

输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]输出:[1,2,3,4,8,12,11,10,9,5,6,7]

代码:

class Solution {
    public int[] printMatrix(int[][] matrix) {
        //如果矩阵为空,直接返回空数组
        if(matrix.length == 0||matrix[0].length == 0)return new int[0];
        //m为矩阵行数,n为矩阵列数
        int m = matrix.length,n = matrix[0].length;
        //dir为方向数组,分别对应向右,向下,向左,向上
        int[][] dir = {{0,1},{1,0},{0,-1},{-1,0}};
        //vis为标记数组,用于标记矩阵某个位置是否被访问过
        int[][] vis = new int[m][n];;
        //res用于存储最终结果
        int[] res = new int[m*n];
        //d为方向标记,x,y为当前位置的横纵坐标,cnt记录res当前存储元素位置
        int d = 0,x = 0,y = 0,cnt = 0;
        //一共需要遍历m*n个元素
        for(int i = 0;i < m*n;i++){
            //标记当前位置被访问过
            vis[x][y] = 1;
            //将当前元素加入结果
            res[cnt++] = matrix[x][y];
            //根据方向标记向对应方向移动
            int x1 = x + dir[d][0],y1 = y + dir[d][1];
            //如果当前位置出现越界或者已经被标记过了,说明方向有问题,调整方向
            if(x1<0||x1>=m||y1<0||y1>=n||vis[x1][y1] == 1)d = (d+1)%4;
            //确定最后移动后的位置
            x += dir[d][0];
            y += dir[d][1];
        }
        //返回结果
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值