返回

轻松掌握「前端刷题」59. 螺旋矩阵 II,向算法高手进发!

前端

螺旋矩阵 II:生成完美螺旋的艺术

简介

准备踏上探索螺旋矩阵 II 的旅程吧!这种巧妙的算法将引导你创建出令人惊叹的 n x n 正方形矩阵,其中元素以完美的螺旋顺序排列。从图像处理到人工智能,螺旋矩阵 II 无处不在,掌握其奥秘将为你的编码工具包锦上添花。

算法概览

螺旋矩阵 II 算法采用分层策略,就像洋葱的层层剥离。它使用两个嵌套循环:一个负责每一层的元素放置,另一个负责每一层元素的移动。

内层循环围绕当前位置顺时针旋转,放置元素并更新位置。外层循环控制着每一层的移动,在四个方向(右、下、左、上)之间切换,指导内层循环的运动。

代码实现

为了让事情更生动,让我们潜入实际代码实现:

const generateMatrix = (n) => {
  // 初始化 n x n 矩阵
  const matrix = Array.from({ length: n }, () => new Array(n).fill(0));

  // 初始化变量
  let i = 0;
  let j = 0;
  let direction = 0; // 0: 右, 1: 下, 2: 左, 3: 上

  // 主循环
  while (i >= 0 && i < n && j >= 0 && j < n) {
    // 根据方向放置元素
    matrix[i][j] = n * (direction / 4) + (i * n + j + 1);

    // 更新方向和位置
    switch (direction) {
      case 0: // 右
        if (j + 1 < n && matrix[i][j + 1] === 0) {
          j++;
        } else {
          direction = 1;
          i++;
        }
        break;
      case 1: // 下
        if (i + 1 < n && matrix[i + 1][j] === 0) {
          i++;
        } else {
          direction = 2;
          j--;
        }
        break;
      case 2: // 左
        if (j - 1 >= 0 && matrix[i][j - 1] === 0) {
          j--;
        } else {
          direction = 3;
          i--;
        }
        break;
      case 3: // 上
        if (i - 1 >= 0 && matrix[i - 1][j] === 0) {
          i--;
        } else {
          direction = 0;
          j++;
        }
        break;
    }
  }

  return matrix;
};

复杂度分析

  • 时间复杂度: O(n^2),因为算法访问每个元素一次。
  • 空间复杂度: O(n^2),因为算法创建一个 n x n 矩阵。

结论

恭喜你掌握了螺旋矩阵 II 算法!现在,你可以自信地将其应用于任何需要按特定螺旋顺序排列元素的场景中。从生成令人着迷的图像到优化复杂的数据结构,螺旋矩阵 II 的用途无穷无尽。

常见问题解答

  • 为什么算法使用两个循环?
    内层循环处理元素放置和移动,而外层循环控制每一层的移动方向。
  • 如何确定方向变化?
    当当前位置无法放置元素时,算法会切换到下一个方向。
  • 算法可以处理非正方形矩阵吗?
    不,算法专为正方形矩阵设计,因为其依赖于方向切换规则。
  • 螺旋矩阵 II 的实际应用是什么?
    生成图像、压缩数据和解决图论问题。
  • 如何优化算法?
    可以通过避免不必要的元素检查和利用循环展开技术来优化算法。