蛇形填充n阶方阵 | 豆包MarsCode AI刷题

0 阅读4分钟

做题笔记:蛇形填充n阶方阵

问题分析

题目要求我们在一个 n x n 的方阵中填充从 1n x n 的数字,填充的顺序是按照蛇形的方式,从右上角开始,顺时针沿着方阵的边界进行填充。我们需要实现一个函数来生成这种特殊排列的矩阵。

解题思路

  1. 螺旋顺序的填充方式:题目要求的是“蛇形”顺序填充,这意味着数字的填充顺序会在矩阵的边界上按顺时针的方向依次进行。我们可以按照以下四个方向依次填充:

    • 从右上角开始,沿着矩阵的右侧列(从上到下)填充;
    • 接着沿着底部行(从右到左)填充;
    • 然后沿着左侧列(从下到上)填充;
    • 最后沿着顶部行(从左到右)填充。
  2. 边界控制:为了确保填充的数字在矩阵内,我们需要控制四个边界:

    • top:当前填充的上边界;
    • bottom:当前填充的下边界;
    • left:当前填充的左边界;
    • right:当前填充的右边界。

    每次完成一圈填充后,更新这些边界,确保下一轮填充时能够正确处理内层的区域。

  3. 终止条件:当 top <= bottomleft <= right 时,表示还有未填充的区域,继续填充;否则,矩阵已经填充完毕。

  4. 细节:根据题目要求,填充完成后需要返回完整的矩阵。

代码实现

public class Solution {
    public static int[][] solution(int n) {
        // 创建n x n的矩阵
        int[][] matrix = new int[n][n];
        
        // 用于填充的数字,从1开始
        int num = 1;
        
        // 初始化四个边界
        int left = 0, right = n - 1, top = 0, bottom = n - 1;
        
        // 当四个边界没有交叉时,继续填充
        while (left <= right && top <= bottom) {
            // 从上向下填充右侧列
            for (int i = top; i <= bottom; i++) {
                matrix[i][right] = num++;
            }
            right--;  // 更新右边界
            
            // 从右向左填充底部行
            for (int i = right; i >= left; i--) {
                matrix[bottom][i] = num++;
            }
            bottom--;  // 更新下边界
            
            // 从下向上填充左侧列
            if (left <= right) {
                for (int i = bottom; i >= top; i--) {
                    matrix[i][left] = num++;
                }
                left++;  // 更新左边界
            }
            
            // 从左向右填充顶部行
            if (top <= bottom) {
                for (int i = left; i <= right; i++) {
                    matrix[top][i] = num++;
                }
                top++;  // 更新上边界
            }
        }
        
        // 返回填充后的矩阵
        return matrix;
    }
}

代码解析

  1. 矩阵初始化

    • 创建了一个 n x n 的矩阵 matrix,并用 num 来表示当前要填充的数字,初始值为 1。
  2. 边界初始化

    • left = 0right = n - 1top = 0bottom = n - 1,分别表示当前矩阵的上下左右边界。
  3. 填充过程

    • 右侧列填充:从 topbottom 填充右侧列(即每一行的最后一列),然后更新右边界 right--
    • 底部行填充:从 rightleft 填充底部行(即当前的最后一行),然后更新下边界 bottom--
    • 左侧列填充:如果 left <= right,则从 bottomtop 填充左侧列(即每一行的第一列),然后更新左边界 left++
    • 顶部行填充:如果 top <= bottom,则从 leftright 填充顶部行(即当前的第一行),然后更新上边界 top++
  4. 终止条件:当所有的边界条件 left <= righttop <= bottom 都不再满足时,表示填充完成,跳出循环并返回矩阵。

时间复杂度分析

  1. 时间复杂度:填充矩阵时,所有的 n x n 的元素都会被访问一次,因此时间复杂度为 O(n^2)
  2. 空间复杂度:我们使用了一个 n x n 的矩阵来存储结果,因此空间复杂度为 O(n^2)

测试用例分析

样例1: 输入:

n = 4

输出:

[[10, 11, 12, 1], [9, 16, 13, 2], [8, 15, 14, 3], [7, 6, 5, 4]]
  • n = 4 的情况下,按蛇形顺序填充,结果如图所示。

样例2: 输入:

n = 5

输出:

[[13, 14, 15, 16, 1], [12, 23, 24, 17, 2], [11, 22, 25, 18, 3], [10, 21, 20, 19, 4], [9, 8, 7, 6, 5]]
  • n = 5 时,按蛇形顺序填充后的矩阵,数字从 1 到 25。

样例3: 输入:

n = 3

输出:

[[7, 8, 1], [6, 9, 2], [5, 4, 3]]
  • n = 3 时,按蛇形顺序填充,最终得到结果。

总结

这道题目通过螺旋顺序填充矩阵,考察了如何在二维数组中按照顺时针方向填充数字。通过设置边界和控制四个方向的填充,能够高效地完成矩阵的填充任务。