JZ29.顺时针打印矩阵

题目

查看题目

思路

  • 坑:要看清楚题目要求,顺时针打印矩阵而不是方阵,所以行和列的长度不一样,要单独进行判断,千万别当成方阵进行求解。
具体算法
  1. ** 空值处理**:当matrix为空时,直接返回空列表[ ]即可(可以判断行和列的长度是否为0,注意判断顺序,先行后列)。
  2. 初始化: 矩阵 左、右、上、下四个边界l,r,t,b,用来存储的ArrayList列表res
  3. 循环打印:“从左到右,从上到下,从右到左,从下到上”四个方向循环,每个方向打印中做一下三件事(不同方向的具体操作如表);
    • 根据边界打印,即将元素按顺序添加res尾部;
    • 边界向内收缩1(代表已被打印);
    • 判断是否打印完毕(边界是否相遇,注意判断的是对向的边界,即从左到右移动时,判断上下 边界是否已经重合),若打印完毕则跳出。
  4. 返回值: 因为没法将ArrayList直接转换为int类型,所以只能用流的方式进行转换。
打印方向根据边界打印边界向内收缩是否打印完毕
从左到右左边界l,右边界r上边界t加1是否t > b
从上到下上边界t,下边界b右边界r减1是否l > r
从右到左右边界r,左边界l下边界b减1是否t > b
从下到上下边界b,上边界t左边界l加1是否l > r

复杂度分析

  • 时间复杂度 O(MN)M, NM,N 分别为矩阵行数和列数。
  • 空间复杂度 O(1) : 四个边界 l , r , t , b 使用常数大小的 额外 空间( res 为必须使用的空间)。

代码

class Solution {
    public int[] spiralOrder(int[][] matrix) {//是矩阵不是方阵,吐了.
        if(matrix.length == 0 || matrix[0].length == 0 ) return new int[0];
        int heng  = matrix.length;
        int zong = matrix[0].length;
        int l = 0;
        int r = zong - 1;
        int t = 0;
        int b = heng - 1;
        int sum = 1;
        ArrayList<Integer> res = new ArrayList<Integer>();
        while(true){
            for(int j = l; j <= r; j++){
                res.add(matrix[t][j]);
            }
            t++;
            if(t > b) break;
            for(int j = t; j <= b; j++){
                res.add(matrix[j][r]);
            }
            r--; 
            if(l > r) break;
            for(int j = r; j >= l; j--){
                res.add(matrix[b][j]);
            }
            b--;
            if(t > b) break;
            for(int j = b; j >= t; j--){
                res.add(matrix[j][l]);
            }
            l++;
            if(l > r) break;
        }
        // int[] res_arr = new int[res.size()];
        int[] res_arr = res.stream().mapToInt(Integer::intValue).toArray();
        return res_arr;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值