模拟过程-螺旋矩阵II

84 阅读1分钟

螺旋矩阵II

描述

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

image.png

分析

这道题目不涉及算法,就是对整个过程进行模拟,尤其考察对于边界处理。

分析循环次数:我们假设顺时针一圈为一个循环。

  • 当n为奇数时,遍历次数为n/2,此时,会有个中间元素,这个元素直接填充即可。
  • 当n为偶数时,遍历次数还是n/2.此时,n/2次循环刚好填充完毕

分析起点:定义变量startX,startY.

  1. 初始startX=startY=0;
  2. 之后的每一轮循环的起始点都需要startX++,startY++.

分析步长:首先需要自己约定好规则,然后去控制步长

image.png

假设此时n为3,四个方向都遵循左闭右开的原则去依次填充。

至于步长,因为每一轮循环填充的步长都是不一样的,可以通过一个offset变量来控制。

code

 public int[][] generateMatrix(int n) {
        int count = 1;
        int startX = 0;
        int startY = 0;

        int[][] matrix = new int[n][n];

        int loop = n / 2;
        int mid = n / 2;

        int l = 0, t = 0;
        int offset = 1;//限制每轮while中,for的填充个数.由于上一轮while填充了一圈,所以下一轮需要offset++

        while (loop > 0) {

            for (l = startX; l < n - offset; l++) {//从左到右
                matrix[startX][l] = count++;
            }

            for (t = startY; t < n - offset; t++) {//从上到下
                matrix[t][l] = count++;
            }

            for (; l > startX; l--) {//从右到左
                matrix[t][l] = count++;
            }
            for (; t > startY; t--) {//从下到上
                matrix[t][l] = count++;
            }
            offset++;
            startX++;
            startY++;
            loop--;
        }

        if (n % 2 == 1) {//奇数的情况下,直接填充中间元素即可。
            matrix[mid][mid] = count++;
        }


        return matrix;
    }