美文网首页图解LeetCode算法
图解LeetCode——剑指 Offer 29. 顺时针打印矩阵

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

作者: 爪哇缪斯 | 来源:发表于2023-04-10 12:13 被阅读0次

一、题目

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

二、示例

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],具体操作逻辑请见下图所示:

image.png

四、代码实现

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;
    }
}
image.png

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

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

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

相关文章

网友评论

    本文标题:图解LeetCode——剑指 Offer 29. 顺时针打印矩阵

    本文链接:https://www.haomeiwen.com/subject/hoaiddtx.html