1.题目
题目地址(59. 螺旋矩阵 II - 力扣(LeetCode))
https://leetcode.cn/problems/spiral-matrix-ii/
题目描述
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1 输出:[[1]]
提示:
1 <= n <= 20
2.题解
基本上同 54.螺旋矩阵 I , 这里为方便只写一种方法了
2.1 分层模拟
代码
- 语言支持:C++
C++ Code:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> ans(n, vector<int>(n));
int rowBegin = 0, rowEnd = n - 1; // 行
int colBegin = 0, colEnd = n - 1; // 列
int cnt = 1;
while (true) {
// 从左向右遍历(行)
for (int i = colBegin; i <= colEnd; i++)
ans[rowBegin][i] = cnt++; // rowBegin 这行已经遍历过了, 下次不可以再遍历, ++rowBegin
if (++rowBegin > rowEnd)
break;
// 从上向下遍历(列)
for (int i = rowBegin; i <= rowEnd; i++)
ans[i][colEnd] = cnt++; // colEnd 这列已经遍历过了, 下次不可以再遍历, --colEnd
if (--colEnd < colBegin)
break;
// 从右向左遍历(行)
for (int i = colEnd; i >= colBegin; i--)
ans[rowEnd][i] = cnt++;
if (--rowEnd < rowBegin)
break;
// 从下向上遍历(列)
for (int i = rowEnd; i >= rowBegin; i--)
ans[i][colBegin] = cnt++;
if (++colBegin > colEnd)
break;
}
return ans;
}
};
复杂度分析
令 n 为数组长度。
- 时间复杂度:\(O(m * n)\)
- 空间复杂度:\(O(1)\)