算法笔记-螺旋矩阵

2024-04-06

# 螺旋矩阵

前言 : 果然这题目又告诉我,你的逻辑推理能力太差了,我自己写的时候,转圈真给自己转进去了,哎。

# 题目

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

示例 1:

img
img

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

示例 2:

1
2
输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 20

这题主要在于模拟过程,知道应该要左闭右开 每个节点末尾留给下一次循环遍历来处理就好。然后难点就在要注意每转一圈之后 都有一个 + 1 的偏移量 和 奇偶数 最后的处理了

这里画一个偶数的情况

# 题解

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class Solution {
public int[][] GenerateMatrix(int n) {
//生成从1 到 n2的数组
int n2 = n * n;
int[][] result = new int[n][];

for(int a= 0;a<n;a++){
result[a] = new int[n];
}
int startx = 0;
int starty = 0;
int offset = 1;
int count = 1;

//这个螺旋矩阵是n*n的 第一圈是[0,n)
int loop = n/2;
int mid = n/2;
int i,j;
while(loop > 0)
{
j = startx;
i = starty;
// 第一条边左闭右开填充
for(i =starty;i< n-offset;i++){
result[startx][i] = count++;
}
// 第二条边
for(j= startx;j < n- offset;j++){
result[j][i] = count++;
}
//第三条边
for(;i>starty;i--){
result[j][i] = count++;
}
//第四条边
for(;j>startx;j--){
result[j][i] = count++;
}
startx++;
starty++;
offset++;
loop--;
}

//最后处理奇数
if (n % 2 == 1) {
result[mid][mid] = count;
}

return result;
}
}

总结一下

这种模拟过程 对于一些 在游戏逻辑中 就比如转圈圈放东西 这种逻辑来说还是非常有必要的。 实际情况可能就是一个 List 然后要在一个二维数组里 比如地图网格 螺旋放物品。 这种情况 也许 可能会出现。 如果出现 那我就愉快的用这个来写了。