首页 > 其他分享 >图解LeetCode——剑指 Offer 29. 顺时针打印矩阵

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

时间:2023-05-23 11:03:33浏览次数:27  
标签:rowStart 遍历 matrix Offer int 29 rowEnd LeetCode colStart

一、题目

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

二、示例

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

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

四、代码实现

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

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

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

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

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

标签:rowStart,遍历,matrix,Offer,int,29,rowEnd,LeetCode,colStart
From: https://blog.51cto.com/u_15003301/6330119

相关文章

  • 图解LeetCode——剑指 Offer 15. 二进制中1的个数
    一、题目编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为'1'的个数(也被称为 汉明重量)。二、示例2.1>示例1:【输入】n=11(控制台输入00000000000000000000000000001011)【输出】3【解释】输入的二进制串000000000000000000000000000010......
  • 图解LeetCode——654. 最大二叉树(难度:中等)
    一、题目给定一个不重复的整数数组 nums。 最大二叉树 可以用下面的算法从 nums递归地构建:1>创建一个根节点,其值为 nums中的最大值。2>递归地在最大值 左边 的 子数组前缀上 构建左子树。3>递归地在最大值右边的 子数组后缀上 构建右子树。返回 nums构建的......
  • 图解LeetCode——1224. 最大相等频率(难度:困难)
    一、题目给你一个正整数数组 nums,请你帮忙从该数组中找出能满足下面要求的最长前缀,并返回该前缀的长度:从前缀中恰好删除一个元素后,剩下每个数字的出现次数都相同。如果删除这个元素后没有剩余元素存在,仍可认为每个数字都具有相同的出现次数(也就是0次)。二、示例2.1>示例1:【......
  • 图解LeetCode——769. 最多能完成排序的块(难度:中等)
    一、题目给定一个长度为n的整数数组arr,它表示在[0,n-1]范围内的整数的排列。我们将arr分割成若干块(即分区),并对每个块单独排序。将它们连接起来后,使得连接的结果和按升序排序后的原数组相同。返回数组能分成的最多块数量。二、示例2.1>示例1:【输入】arr=[4,3,2,......
  • 图解LeetCode——940. 不同的子序列 II(难度:困难)
    一、题目给定一个字符串s,计算s的不同非空子序列的个数。因为结果可能很大,所以返回答案需要对10^9+7取余。字符串的子序列是经由原字符串删除一些(也可能不删除)字符但不改变剩余字符相对位置的一个新字符串。例如:"ace"是"abcde"的一个子序列,但"aec"不是。二、示例2.......
  • 图解LeetCode——1441. 用栈操作构建数组(难度:中等)
    一、题目给你一个数组target和一个整数n。每次迭代,需要从 list={1,2,3...,n}中依次读取一个数字。请使用下述操作来构建目标数组target:"Push":从list中读取一个新元素,并将其推入数组中。"Pop":删除数组中的最后一个元素。如果目标数组构建完成,就停止读取更多元......
  • 图解LeetCode——886. 可能的二分法(难度:中等)
    一、题目给定一组 n 人(编号为 1,2,...,n), 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人,那么他们不应该属于同一组。给定整数n 和数组dislikes ,其中 dislikes[i]=[ai,bi] ,表示不允许将编号为ai 和  bi的人归入同一组。当可以用这种方法将所有人......
  • 图解LeetCode——827. 最大人工岛(难度:困难)
    给你一个大小为nxn二进制矩阵grid。最多只能将一格 0变成 1。返回执行此操作后,grid中最大的岛屿面积是多少?岛屿由一组上、下、左、右四个方向相连的 1形成。二、示例2.1>示例1:【输入】grid=[[1,0],[0,1]]【输出】3【解释】将一格0变成1,最终连通两个小......
  • 图解LeetCode——904. 水果成篮(难度:中等)
    一、题目你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组fruits表示,其中fruits[i]是第i棵树上的水果种类。你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:你只有两个篮子,并且每个篮子只能装单一类型的水果......
  • pytest + yaml 框架 -29.模板过滤器语法与自定义过滤器使用
    前言v1.2.6版本支持模板过滤器语法的使用,并且可以自定义过滤器了。针对有同学提到上个接口返回一个id值,下个接口引用变量的时候需要根据这个值做一些运算,比如在引用的结果加1.jinja2是可以支持模板过滤器语法的,本篇介绍下模板过滤器的相关使用.v1.2.6版本主要更新以下几点1......