[剑指 offer]--数组--面试题29. 顺时针打印矩阵

1 题目描述

2 解题思路

根据题目示例 matrix = [[1,2,3],[4,5,6],[7,8,9]] 的对应输出 [1,2,3,6,9,8,7,4,5]
可以发现,顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。
因此,考虑设定矩阵的“左、上、右、下”四个边界,模拟以上矩阵遍历顺序。
在这里插入图片描述

算法流程:

  • 空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。
  • 初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 res 。
  • 循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环,每个方向打印中做以下三件事 (各方向的具体信息见下表);
    1)根据边界打印,即将元素按顺序添加至列表 res 尾部;
    2) 边界向内收缩 1 (代表已被打印);
    3)判断是否打印完毕(边界是否相遇),若打印完毕则跳出。
  • 返回值: 返回 res 即可。

在这里插入图片描述

鉴于对上面表格的理解,自己总结出了边界条件和遍历到的值,画出下面的图片方便理解

在这里插入图片描述
作者:jyd
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/solution/mian-shi-ti-29-shun-shi-zhen-da-yin-ju-zhen-she-di/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

3 解决代码

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length == 0) {
            return new int[0];
        }
        int l = 0;
        int r = matrix[0].length -1;
        int t = 0;
        int b = matrix.length -1;
        int x = 0;
        int[] res = new int[(r + 1)*(b + 1)];
        while(true) {
            // left to right.
            for(int i = l; i <= r; i++) res[x++] = matrix[t][i]; 
            if(++t > b) break; //break是跳出上层循环,也就是说,四个条件有一个不满足,就结束循环了
            // top to bottom.
            for(int i = t; i <= b; i++) res[x++] = matrix[i][r]; 
            if(l > --r) break;
            // right to left.
            for(int i = r; i >= l; i--) res[x++] = matrix[b][i]; 
            if(t > --b) break;
            // bottom to top.
            for(int i = b; i >= t; i--) res[x++] = matrix[i][l]; 
            if(++l > r) break;
        }
        return res;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值