59.螺旋矩阵II

153 阅读2分钟

59.螺旋矩阵II

LeetCode

描述:

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

示例 1:

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

思路:

  • 这个题目的要求很明显, 输入为需要的矩阵的维数, 输出为对应的螺旋矩阵
  • 可以将填充这个矩阵的过程分为四步:
    1. 从左至右依次填充上行
    2. 从上之下依次填充右行
    3. 从右至左依次填充下行
    4. 从下至上依次填充左行
  • 每一圈的填充都需要进行上述四步, 共需要n/2次循环, 当n为奇数时需要考虑最后一个元素

代码:

/*
 * @lc app=leetcode.cn id=59 lang=cpp
 *
 * [59] 螺旋矩阵 II
 */

// @lc code=start
class Solution
{
public:
  vector<vector<int>> generateMatrix(int n)
  {

    vector<vector<int>> res(n, vector<int>(n, 0)); // 存放返回值的二维数组

    int x{0}, y{0};                // 每次循环的开始位置
    int loop = n / 2; // 循环端圈数
    int mid = n / 2;               // 当n为奇数时, 最后的中间位置坐标为(mid, mid)
    int val = 1;                   // 用于为数组赋值的变量
    int offset = 1;                // 控制每圈的长度

    int i, j;
    while (loop--)
    {
      i = x;
      j = y;

      // 填充上行, 由左到右
      for (j = y; j < y + n - offset; j++)
      {
        res[x][j] = val++;
      }

      // 填充右行, 由上到下
      for (i = x; i < x + n - offset; i++)
      {
        res[i][j] = val++;
      }

      // 填充下行, 由右到左
      for (; j > y; j--)
      {
        res[i][j] = val++;
      }

      // 填充左行, 由下到上
      for (; i > x; i--)
      {
        res[i][j] = val++;
      }

      x++;
      y++;

      offset += 2;
    }

    if (n % 2)
    {
      res[mid][mid] = val;
    }

    return res;
  }
};

时间复杂度:O(n^2^),其中 n 是给定的正整数。矩阵的大小是 n×n,需要填入矩阵中的每个元素。

空间复杂度:O(1)。除了返回的矩阵以外,空间复杂度是常数。