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

简介: 图解LeetCode算法

一、题目

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

二、示例

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;
    }
}

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

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

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


相关文章
|
4月前
|
存储 算法 NoSQL
LeetCode第73题矩阵置零
文章介绍了LeetCode第73题"矩阵置零"的解法,通过使用矩阵的第一行和第一列作为标记来记录哪些行或列需要置零,从而在不增加额外空间的情况下解决问题。
LeetCode第73题矩阵置零
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
63 6
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
57 4
|
2月前
|
算法 C++
Leetcode第59题(螺旋矩阵2)
这篇文章介绍了解决LeetCode第59题“螺旋矩阵II”的算法,通过C++编程实现按顺时针顺序填充一个n x n的正方形矩阵。
18 0
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
57 6
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
34 4
|
4月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
27 3
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
42 3
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
37 2
|
4月前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
38 0
【Leetcode刷题Python】73. 矩阵置零