59 螺旋矩阵 II

本文最后更新于:2022年8月26日 晚上

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

示例:

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

Solution

  • 54 解法类似
  • 模拟法,设定边界,参考**@Krahets**
Picture1.png
  • 使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# @lc code=start
class Solution:
def generateMatrix(self, n: int) -> [[int]]:
l, r, t, b = 0, n - 1, 0, n - 1
mat = [[0 for _ in range(n)] for _ in range(n)]
num, tar = 1, n * n
while num <= tar:
for i in range(l, r + 1): # left to right
mat[t][i] = num
num += 1
t += 1
for i in range(t, b + 1): # top to bottom
mat[i][r] = num
num += 1
r -= 1
for i in range(r, l - 1, -1): # right to left
mat[b][i] = num
num += 1
b -= 1
for i in range(b, t - 1, -1): # bottom to top
mat[i][l] = num
num += 1
l += 1
return mat

# @lc code=end

cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> mat(n, vector<int>(n, 0));
int l=0, r=n-1, t=0, b=n-1;
int num=1, target=n*n;

while(num<=target){
// 从左到右(左闭右开)
for(int i=l; i<r+1; ++i){
mat[t][i] = num;
num += 1;
}
t++;
// 从上到下(左闭右开)
for(int i=t; i<b+1; ++i){
mat[i][r] = num;
num += 1;
}
r--;
// 从右往左(左闭右开)
for(int i=r; i>l-1; --i){
mat[b][i] = num;
num += 1;
}
b--;
// 从下往上(左闭右开)
for(int i=b; i>t-1; --i){
mat[i][l] = num;
num += 1;
}
l++;
}
return mat;
}
};

java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
int index = 1;
int l = 0;
int r = n - 1;
int t = 0;
int b = n - 1;
while (index <= n * n) {
// 左闭右开区间
for (int i = l; i < r + 1; ++i) {
result[t][i] = index;
index++;
}
t += 1;
for (int i = t; i < b + 1; ++i) {
result[i][r] = index;
index++;
}
r -= 1;
for (int i = r; i > l - 1; --i) {
result[b][i] = index;
index++;
}
b -= 1;
for (int i = b; i > t - 1; --i) {
result[i][l] = index;
index++;
}
l += 1;
}
return result;
}
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!