图解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^)/ ~ 「干货分享,每天更新」


相关文章
|
2天前
|
算法
力扣经典150题第三十七题:矩阵置零
力扣经典150题第三十七题:矩阵置零
7 2
|
20天前
|
存储 数据采集 算法
LeetCode题目73:矩阵置零
LeetCode题目73:矩阵置零
|
2天前
力扣随机一题 6/28 数组/矩阵
力扣随机一题 6/28 数组/矩阵
5 0
|
1月前
|
存储
【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
25 1
|
17天前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
|
17天前
|
算法
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
20天前
|
机器学习/深度学习 算法 数据挖掘
LeetCode题目74:搜索二维矩阵
LeetCode题目74:搜索二维矩阵
|
24天前
|
搜索推荐 Java
单源最短路(只有一个起点)bfs,多源BFS,目录力扣675.为高尔夫比赛砍树,多源最短路问题:力扣542.01矩阵力扣1020.飞地的数量
单源最短路(只有一个起点)bfs,多源BFS,目录力扣675.为高尔夫比赛砍树,多源最短路问题:力扣542.01矩阵力扣1020.飞地的数量
|
1月前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
15天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题