LeetCode59. 螺旋矩阵 II(java实现,史上最详细教程,想学会的进!!!)

今天来分享一下螺旋矩阵的解题思路及代码的实现。
题目描述如下:
在这里插入图片描述
首先拿到这道题,首先不要慌张,我们来仔细分析一下会发现并没有那么难。
首先看下边界的元素是1、2、3递增的,那么我们也许可以根据这一点先把边界的元素一个一个给加入到数组中。
具体思路如下:
我们看下面这个例子,我们创建一个4行4列的螺旋矩阵来进行分析
在这里插入图片描述
如果我们每次处理前3个数字,比如第一行我们处理1-3,然后继续处理列也就是4-6,然后处理7-9,这样可以发现一个规律就是我们每次都不对末尾的元素进行处理,这样遵循了循环不变原则。
然后处理完一圈之后一次对内部的13、14、15、16依次处理。
那么需要注意的是输入的n是奇数和偶数的处理还是有一定的区别。
完整的代码如下:


```java
public  static  int[][] generateMatrix(int n) {
        int i=0;
        int j=0;
        int startx=0;
        int starty=0;
        int count=1;//用于1-16的赋值
        int flag=1;
        int[][] arr=new int[n][n];
        int k=n;
        while (k/2>0){//控制循环的次数
            //处理第一行
            for (j=starty;j<n-flag;j++){
                //这里需要注意,行要为startx,如果行设置为i的话,
                // 由于执行了第4个for循环后,i指向了0,那么在第一轮while循环没有问
                //题,但是会影响2、3。。。次while循环的赋值
                arr[startx][j]=count;//每次赋值完之后记得对count进行++
                count++;
            }

            for (i=startx;i<n-flag;i++){
                arr[i][j]=count;
                count++;
            }
            for (j=n-flag;j>starty;j--){
                arr[i][j]=count;
                count++;
            }
            for (i=n-flag;i>startx;i--){
                arr[i][j]=count;
                count++;

            }
            k-=2;//每次循环后k-2
            /**
             * 当经过一次循环后,需要对startx、y、flag进行++,便于后续的while循环的赋值
             */
            flag++;
            startx++;
            starty++;



        }
        //如果输入的n为奇数将中间的值进行赋值。
        if (n%2!=0){
            arr[startx][starty]=count;
        }
        return arr;
    }

``
方便大家理解我花了下面这幅图
在这里插入图片描述
第一轮while循环执行的步骤,当执行完第一个for循环之后,j指向了红色箭头,然后执行第2个for循环对蓝色框进行赋值,然后i指向了蓝色箭头所示,,,后面的两个for循环分别对紫色和绿色矩阵进行赋值。
需要注意的几个点:
1.当经过一次循环后,需要对startx、y、flag进行++,便于后续的while循环的赋值。
2. 每次while循环后需要进行-2或者/2的操作,但是不要操作传进来的n,需要用一个变量进行赋值,这样不会改变n的值,不会影响for循环的判断。
3. 还有就是对传入的n为奇数时的处理。
那么本道题的所有代码及思路就到这里结束了,如果有问题可以在文章下方留言,觉得博主写的不错的话麻烦点个小小的爱心。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值