59. 螺旋矩阵 II 模拟过程

59. 螺旋矩阵 II
思路
用代码模拟出顺时针填充数字的过程
每填充一圈涉及4条边:顶部、右列、底部、左列
image
对每条边的处理保持一致,每条边均采用左闭右开统一处理,避免出现混乱,即循环不变量原则
不变量:坚持相同的原则。在本题中就是坚持每条边左闭右开的原则,最右侧元素留作下一条边的起始元素进行处理。

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        int startX = 0, startY = 0; // 每圈起点
        int count = 1; // 用于填充的数
        int offset = 1;
        int loop = 1; // 记录循环次数
        int i, j; // j代表列,i代表行
        while (loop <= n/2) {
            // 顶部
            // 左闭右开,j不能取 n - offset
            for (j = startY; j < n - offset; j++) {
                matrix[startX][j] = count++;
            }
            // 右列
            // 左闭右开,i不能取 n - offset
            for (i = startX; i < n - offset; i++) {
                matrix[i][j] = count++;
            }
            // 底部
            // 左闭右开,j不能取startX
            for (; j > startX; j--) {
                matrix[i][j] = count++;
            }
            // 右列
            // 左闭右开,i不能取startY
            for (; i > startY; i--) {
                matrix[i][j] = count++;
            }

            startX++;
            startY++;
            offset++;
            loop++;
        } 

        // n为奇数
        if (n % 2 == 1) matrix[startX][startY] = count;

        return matrix;
    }
}

进阶
当n为奇数时,剩下最后矩阵中心元素未填充。
offset的意义:结束一圈填充后,下一圈填充的起始位置向后移,结束位置向前移。起始位置(startX, startY),结束位置(n - offset, n - offset)。

补充

posted @ 2025-10-13 16:36  Nickey103  阅读(7)  评论(0)    收藏  举报