LeetCode_数组_中等_59.螺旋矩阵 II

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)

1.题目

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

示例 1:
LeetCode_数组_中等_59.螺旋矩阵 II_第1张图片
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:
输入:n = 1
输出:[[1]]

提示:
1 <= n <= 20
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix-ii

2.思路

(1)此题思路与LeetCode_54.螺旋矩阵类似。分析题目可知,按照顺时针螺旋顺序生成矩阵中的整数时,从起点 matrix[0][0] 开始,总是按照向右→向下→向左→向上→向右→向下→…的方向开始,直到将整个矩阵填满为止。故可以考虑照这个规律来生成矩阵中的所有整数,具体的步骤如下:
(1.1)定义行数和列数均为 n 的矩阵 matrix;
(1.2)为了防止在按上述方向生成整数时覆盖掉已经生成的整数,所以可以设置一个与矩阵同行同列的visited数组,其元素类型为boolean,若visited[i][j]=true,则说明已经生成过矩阵中的元素matrix[i][j],否则说明没有生成;
(1.3)为了在程序中实现按上述方向生成整数,可以用direction来表示即将要生成整数的方向,direction=1、2、3、4分别表示在矩阵中向右、下、左、上方向生成整数;
(1.4)设置起点坐标i和j,在本题中,起点整数为matrix[0][0],故其初始值均为num=1,然后设置visited[i][j]=true,即表示起点已经生成整数,以上准备工作完成后,便可以开始循环生成整数了;
(1.5)在生成整数过程中,使用if-else语句来判断遍历的方向,并且每访问,就将该元矩阵matrix中的一个位置,就将生成的整数保存在该位置,此外在生成整数过程中尤其要注意防止数组越界以及整数覆盖的问题,当某一个位置的上述四个方向都不能生成整数时,则说明已经将矩阵的所有位置都填满,此时直接退出循环并返回 matrix 即可。

3.代码实现(Java)

//(1)思路1
public int[][] generateMatrix(int n) {
     
    int[][] matrix = new int[n][n];
    //visited[i][j]==true:已经生成过矩阵中的元素matrix[i][j]
    boolean[][] visited = new boolean[n][n];
    //direction=1、2、3、4分别表示在矩阵中向右、下、左、上方向上生成整数
    //初始时,按照向右→向下→向左→向上→向右→向下→...的方向开始生成整数,直到将整个矩阵填满为止
    int direction=1;
    //定义生成整数起点的横纵坐标
    int i=0,j=0;
    //设生成的起始整数num=1
    int num = 1;
    matrix[i][j]=num;
    //将生成整数的起点设置为已访问的状态
    visited[i][j]=true;
    while(true){
     
        if(direction==1 && j+1<n && visited[i][j+1]==false){
     
            //向右生成整数
            while(j+1<n && visited[i][j+1]==false){
     
                matrix[i][j+1]=++num;
                visited[i][j+1]=true;
                j++;
            }
            direction++;        
        }else if(direction==2 && i+1<n && visited[i+1][j]==false){
     
            //向下生成整数
            while(i+1<n && visited[i+1][j]==false){
     
                matrix[i+1][j]=++num;
                visited[i+1][j]=true;
                i++;
            }
            direction++;
        }else if(direction==3 && j-1>=0 && visited[i][j-1]==false){
     
            //向左生成整数
            while(j-1>=0 && visited[i][j-1]==false){
     
                matrix[i][j-1]=++num;
                visited[i][j-1]=true;
                j--;;
            }
            direction++;
        }else if(direction==4 && i-1>=0 && visited[i-1][j]==false){
     
            //向上生成整数
            while(i-1>=0 && visited[i-1][j]==false){
     
                matrix[i-1][j]=++num;
                visited[i-1][j]=true;
                i--;
            }
            direction=1;
        }else{
     
            //生成整数结束
            break;
        }
    }
    return matrix;
}

你可能感兴趣的:(LeetCode算法刷题,leetcode,算法,数组)