❓59. 螺旋矩阵 II
难度:中等
给你一个正整数 n
,生成一个包含 1
到
n
2
n^2
n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
- 1 <= n <= 20
💡思路:模拟法
模拟矩阵的生成。按照要求:
- 初始位置设为矩阵的左上角,初始方向设为向右。
- 若下一步的位置超出矩阵边界,或者是之前访问过的位置,则==顺时针旋转==(右 -> 下 -> 左 -> 上 循环),进入下一个方向。
- 如此反复直至填入 n 2 n^2 n2。
记 ans
为所求的矩阵,其初始元素设为 0
。由于填入的元素均为正数,我们可以判断当前位置的元素值,若不为 0
,则说明已经访问过此位置。
🍁代码:(Java、C++)
Java
class Solution {
public int[][] generateMatrix(int n) {
int[][] ans = new int[n][n];
int row = 0, col = 0;
for(int i = 1; i <= n * n;){
//先向右,行不变,列+1
while(col < n && ans[row][col] == 0 && i <= n * n){
ans[row][col++] = i++;
}
row++;
col--;
//向下,列不变,行+1
while(row < n && ans[row][col] == 0 && i <= n * n){
ans[row++][col] = i++;
}
row--;
col--;
//向左,行不变,列-1
while(col >= 0 && ans[row][col] == 0 && i <= n * n){
ans[row][col--] = i++;
}
row--;
col++;
//向上,列不变,行-1
while(row >= 0 && ans[row][col] == 0 && i <= n * n){
ans[row--][col] = i++;
}
row++;
col++;
}
return ans;
}
}
C++
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> ans(n, vector<int>(n, 0));
int row = 0, col = 0;
for(int i = 1; i <= n * n;){
//先向右,行不变,列+1
while(col < n && ans[row][col] == 0 && i <= n * n){
ans[row][col++] = i++;
}
row++;
col--;
//向下,列不变,行+1
while(row < n && ans[row][col] == 0 && i <= n * n){
ans[row++][col] = i++;
}
row--;
col--;
//向左,行不变,列-1
while(col >= 0 && ans[row][col] == 0 && i <= n * n){
ans[row][col--] = i++;
}
row--;
col++;
//向上,列不变,行-1
while(row >= 0 && ans[row][col] == 0 && i <= n * n){
ans[row--][col] = i++;
}
row++;
col++;
}
return ans;
}
};
🚀 运行结果:
🕔 复杂度分析:
- 时间复杂度:
O
(
n
2
)
O(n^2)
O(n2),其中
n
是给定的正整数。矩阵的大小是n×n
,需要填入矩阵中的每个元素。 - 空间复杂度: O ( 1 ) O(1) O(1),除了返回的矩阵以外,空间复杂度是常数。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!