图解LeetCode——剑指 Offer 29. 顺时针打印矩阵

文章介绍了如何按照顺时针顺序遍历并打印矩阵中的数字,给出了详细的解题思路和边界条件处理,以及对应的Java代码实现。通过固定行号或列号并改变列号或行号来实现向右、向下、向左、向上的遍历,直至遍历完整个矩阵。
摘要由CSDN通过智能技术生成

一、题目

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

二、示例

2.1> 示例 1:

输入】matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出】[1,2,3,6,9,8,7,4,5]

2.2> 示例 2:

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

限制:

  • 0 <= matrix.length <= 100
  • 0 <= matrix[i].length <= 100

三、解题思路

根据题目描述,我们可以比较容易的想到这道题的解题思路是——模拟解题。也就是说,根据题目描述的执行方式去采用编码的方式进行解题。

首先,在遍历矩阵之前,我们先考虑好边界问题,因为要按照采用从外向里以顺时针的顺序依次打印出每一个数字的方式,所以我们需要考虑4个边界值,即:

行的开始边界rowStart=0,每当遍历完该行之后,会执行rowStart++;
行的结束边界rowEnd = matrix.length - 1,每当遍历完该行之后,会执行rowEnd--;
列的开始边界colStart=0,每当遍历完该行之后,会执行colStart++;
列的结束边界colEnd = matrix[0].length - 1,每当遍历完该行之后,会执行colEnd--;

当我们执行遍历的时候,当发生rowStart > rowEnd或者colStart > colEnd,则表示遍历越界了,可以直接结束遍历操作了

然后,如果我们希望遍历这个矩阵matrix的时候,采用从外向里以顺时针的顺序依次打印出每一个数字的方式,我们需要考虑的就是如何达到这种遍历方式,此时我们可以暂时不去考虑越界的问题:

向右移动】我们固定好行号row,采用for循环的方式,依次递增列号col,即:matrix[rowStart][i],其中i为递增的列号;
向下移动
】我们固定好列号col,采用for循环的方式,依次递增行号col,即:matrix[i][colEnd],其中i为递增的行号;
向左移动
】我们固定好行号row,采用for循环的方式,依次递减列号col,即:matrix[rowEnd][i],其中i为递减的列号;
向上移动
】我们固定好列号col,采用for循环的方式,依次递减行号col,即:matrix[i][colStart] ,其中i为递减的行号;

上面就是本道题的解题思路了,我们还是按照惯例,举个例子来看一下具体的处理过程。我们给定一个矩阵输入为:matrix = [[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[] spiralOrder(int[][] matrix) {
        if(matrix.length == 0) return new int[0];
        int rowStart = 0, colStart = 0, rowEnd = matrix.length - 1, colEnd = matrix[0].length - 1, index = 0;
        int[] result = new int[matrix.length * matrix[0].length];
        while(true) {
            // 向右遍历
            for (int i=colStart; i<=colEnd; i++) result[index++] = matrix[rowStart][i]; 
            if (++rowStart > rowEnd) break;
            // 向下遍历
            for (int i=rowStart; i<=rowEnd; i++) result[index++] = matrix[i][colEnd]; 
            if (--colEnd < colStart) break;
            // 向左遍历
            for (int i=colEnd; i>=colStart; i--) result[index++] = matrix[rowEnd][i]; 
            if (--rowEnd < rowStart) break;
            // 向上遍历
            for (int i=rowEnd; i>=rowStart; i--) result[index++] = matrix[i][colStart]; 
            if (++colStart > colEnd) break;
        }
        return result;
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值