【Java实现高频】剑指offer29——顺时针打印二维数组(LeetCode54:螺旋矩阵)

剑指offer29——顺时针打印矩阵(力扣54:螺旋矩阵):思路分享

图片来自力扣
思路解析:

找到左上角和右下角,就能够将一圈的数字打印出来!打印完一圈后,只需要左上角的坐标+1,右下角的坐标-1,循环即可

循环判断条件就是左上角的坐标<=右上角的坐标

步骤分析:

  1. 判断二维数组是否为空,为空则返回空数组
  2. 找到左上角和右下角的坐标,设为(tR,tC),(dR,dC)
  3. 创建结果数组
  4. 创建数组索引,便于向数组中传值
  5. 进入循环,确定循环终止条件:是左上角和右上角重合
  6. 进入循环首先判断是否为同一条直线
  7. 如果不是一条直线,按顺序打印”上、右、下、左“四条边
  8. 每次循环结束,都要改变起始坐标

注意!

  • 每列(行)的转折点交给下一行(列)处理,不然会出现数组越界
  • 如果是用数组接收打印结果的话,要注意数组的索引,也就是全局变量count,此时不能将打印代码封装到while循环中,count的值会覆盖
  • !!每次大循环结束,再改变坐标:因为当出现所有数在一行或一列的情况时,结果一次就打印完了。如果最后没改变坐标,将会进入死循环,只有改变坐标后,才能触发循环终止条件,及左上角坐标大于右下角,才能返回值。

复杂度分析:

  • 时间复杂度为O(mn),因为将每个元素都访问了一遍
  • 空间复杂度为O(1),因为不需要额外空间,数组res是题目中规定的

Java代码如下:

class Solution {
   
    public int[] spiralOrder(int[][] matrix) {
   
        //如果二维数组为空,返回空数组即可
        if(matrix.length==
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值