This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

矩阵

题意:

难度:

示例:

解析:

1 - 59. 螺旋矩阵 II

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

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

示例:

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

难度:

中等

分析:

  • 定义边界法:
    • 使用四个变量记录当前要填充区域的边界:left、right、top、bottom
    • 初始时 left=0、right=n-1、top=0、bottom=n-1
    • 每填充完一条边,相应的边界就向内收缩一格
  • 填充规则:
    • 从左到右填充上边界:固定行(top),列从 left 到 right
    • 从上到下填充右边界:固定列(right),行从 top 到 bottom
    • 从右到左填充下边界:固定行(bottom),列从 right 到 left
    • 从下到上填充左边界:固定列(left),行从 bottom 到 top
  • 循环终止条件:
    • 当填入的数字达到 n² 时停止
    • 或者当四个边界相互交错时停止
class Solution {
    public int[][] generateMatrix(int n) {
        // 正确初始化二维数组
        int[][] matrix = new int[n][n];
        
        // 定义四个边界
        int left = 0;
        int right = n - 1;
        int top = 0;
        int bottom = n - 1;
        
        // 数字从1开始填充
        int num = 1;
        
        while (num <= n * n) {
            // 从左到右填充上边界
            for (int i = left; i <= right; i++) {
                matrix[top][i] = num++;
            }
            top++;
            
            // 从上到下填充右边界
            for (int i = top; i <= bottom; i++) {
                matrix[i][right] = num++;
            }
            right--;
            
            // 从右到左填充下边界
            for (int i = right; i >= left; i--) {
                matrix[bottom][i] = num++;
            }
            bottom--;
            
            // 从下到上填充左边界
            for (int i = bottom; i >= top; i--) {
                matrix[i][left] = num++;
            }
            left++;
        }
        
        return matrix;
    }
}