59.螺旋矩阵II
描述:
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
思路:
- 这个题目的要求很明显, 输入为需要的矩阵的维数, 输出为对应的螺旋矩阵
- 可以将填充这个矩阵的过程分为四步:
- 从左至右依次填充上行
- 从上之下依次填充右行
- 从右至左依次填充下行
- 从下至上依次填充左行
- 每一圈的填充都需要进行上述四步, 共需要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)。除了返回的矩阵以外,空间复杂度是常数。