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

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

【Java实现】剑指offer29——顺时针打印二维数组(LeetCode54:螺旋矩阵)_第1张图片
思路解析:

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

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

步骤分析:

  1. 找到左上角和右下角的坐标,设为(tR,tC),(dR,dC)
  2. 判断二维数组是否为空,然后进入循环
  3. 循环终止条件:是左上角和右上角重合
  4. 进入循环判断是否为同一条直线,然后按顺序打印”上、右、下、左“四条边,每次循环结束,都要改变起始坐标

注意!

  • 每列(行)的转折点交给下一行(列)处理,不然会出现数组越界
  • 如果是用数组接收打印结果的话,要注意数组的索引,也就是全局变量count,此时不能将打印代码封装到while循环中,count的值会覆盖

复杂度分析:

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

Java代码如下:

class Solution {
     
    public int[] spiralOrder(int[][] matrix) {
     
        //如果二维数组为空,返回空数组即可
        if(matrix.length==0 || matrix==null || matrix[0].length==0) {
     
            return new int[0];
        }

        //找到左上角和右上角
        int tR=0, tC=0;
        int dR=matrix.length-1, dC=matrix[0].length-1; 

        //定义结果数组
        int[] res=new int[(dR+1) * (dC+1)];

        //数组索引
        int count=0;

        while(tR<=dR && tC<=dC) {
     
            //判断是否在同一行或者同一列
            if(tR==dR) {
     
                for(int i=tC;i<=dC;i++) {
     
                    res[count++]=matrix[tR][i];
                }
            } else if(tC==dC) {
     
                for(int i=tR;i<=dR;i++) {
     
                    res[count++]=matrix[i][tC];
                }
            } else {
     
                int curR=tR, curC=tC;
                while(curC<dC) {
     
                    res[count++]=matrix[tR][curC++];
                }
                while(curR<dR) {
     
                    res[count++]=matrix[curR++][dC];
                }
                while(curC>tC) {
     
                    res[count++]=matrix[dR][curC--];
                }
                while(curR>tR) {
     
                    res[count++]=matrix[curR--][tC];
                }
            }
            tR++;
            tC++;
            dR--;
            dC--;
        }
        return res;
    }
}

你可能感兴趣的:(刷题分享,java,数据结构,算法,面试,leetcode)