力扣-数组 螺旋矩阵

161 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。

螺旋矩阵

题目描述

给你一个正整数n,生成一个包含1到n2n^2所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix

示例1:

3.png

输入:n=3  
输出:[[1,2,3],[8,9,4],[7,6,5]]  

示例2:

输入:n=1  
输出:[[1]]

解析

题意分析

首先由这个给出的示例的3*3矩阵 我们来分析一下题意,

  • 现在给定一个正整数3,生成一个1到9的螺旋排列的正方形矩阵,
  • 第一行的三个数为1、2、3,起始位置为1,到3结束,
  • 然后从3开始,第3列的三个数为3、4、5,到5结束,
  • 之后5作为起始位置,第三行从右往左的三个数为5、6、7,到7结束,
  • 之后7作为起始位置,然后向上只有一个位置,由数组8补上,
  • 之后再转向中间的位置,才能最终形成螺旋排列的正方形矩阵,中间的位置就是最后一个正整数

思路延申

要画出这个螺旋排列的正方形矩阵,可以从上下左右四个角度分四步进行

  • 从上行开始填入数字,从左到右
  • 从右列开始填入数字,从上到下
  • 从下行开始填入数字,从右到左
  • 从左列开始填入数字,从下到上
    以上操作完成时,如果是边长为奇数的矩阵中间还有空格,可填入最后一个正整数,如果是边长为偶数的矩阵中间,欸有空格,以上操作完成

代码

public int[][] generateMatrix(int n) {
        //定义边长为n的二维数组
        int [][] arr=new int[n][n];
        //定义循环次数
        int times=n/2;
        //定义每次循环起始位置
        int startX=0;
        int startY=0;
        //定义偏移量
        int offset=1;
        //定义填充数字,从1开始
        int count=1;
        //定义中间位置
        int mid=n/2;
        while(times>0){
            //从上行开始填入数字,从左到右:1->2
            for(int j=startY;j<startY+n-offset;++j){
                arr[startX][j]=count++;
            }
            //从右列开始填入数字,从上到下:3->4  
            for(int i=startX;i<startX+n-offset;++i){
                arr[i][j]=count++;
            }
            //从下行开始填入数字,从右到左:5->6
            for(int j=startY;j>startY;j--){
                arr[i][j]=count++;
            }
            //从左列开始填入数字,从下到上:7->8
            for(int i=startX;i>startX;i--){
                arr[i][j]=count++;
            }
            times--;
            startX+=1;
            startY+=1;
            offset+=2;
        }
        //做判断,n为奇数的矩阵中间有一个空格,填入最后一个数字:9
        if(n%2==1){
            arr[mid][mid]=count;
        }
        //返回整个二维数组
        return arr;
    }