LeetCode 59. 螺旋矩阵 II(中)

声明一个 \(n \times n\) 的数组 matrix,调用 spiralOrder 函数,输出顺时针遍历的坐标数组 positions
声明整形数字数组 nums
基于顺时针遍历的坐标数组整形数字数组填入matrix
return matrix

题目

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

示例

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

考察知识点

数组

核心思想

算法

  • 声明一个 \(n \times n\) 的数组 matrix,调用 spiralOrder 函数,输出顺时针遍历的坐标数组 positions
  • 声明整形数字数组 nums
  • 基于顺时针遍历的坐标数组整形数字数组填入matrix
  • return matrix

Python版本

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
53
54
55
56
57
58
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
def spiral_coords(start_r , start_c, end_r, end_c):
for c in range(start_c, end_c + 1):
yield start_r, c
for r in range(start_r + 1, end_r + 1):
yield r, end_c
if start_r < end_r and start_c < end_c:
for c in range(end_c - 1, start_c, -1):
yield end_r, c
for r in range(end_r, start_r, -1):
yield r, start_c

if not matrix: return []
start_r, end_r = 0, len(matrix) - 1
start_c, end_c = 0, len(matrix[0]) - 1
ans = []
while start_r <= end_r and start_c <= end_c:
for r,c in spiral_coords(start_r , start_c, end_r, end_c):
ans.append((r, c))
start_r += 1
start_c += 1
end_r -= 1
end_c -= 1

return ans

def generateMatrix(self, n: int) -> List[List[int]]:
# 声明一个 n * n 的数组,输出顺时针遍历的坐标数组。
matrix = [[0 for _ in range(n)] for _ in range(n)]
# 调用 spiralOrder 函数,输出顺时针遍历的坐标数组 positions 。
positions = self.spiralOrder(matrix)
# 声明整形数字数组 nums。
nums = list(range(1, n**2+1))
for index,position in enumerate(positions):
matrix[position[0]][position[1]] = nums[index]
# 基于顺时针遍历的坐标数组将整形数字数组填入matrix。
return matrix

print("leet code accept!!!")
Input = [3]
Input1 = [10]
Answer = [
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
]

if __name__ == "__main__":
solution = Solution()
for i in range(len(Input)):
print("-"*50)
reslut = solution.generateMatrix(Input[i])
print(Answer[i])
print(reslut)
print(reslut == Answer[i])

时间复杂度: \(O(N)\),其中 N 是输入矩阵所有元素的个数。
空间复杂度: \(O(N^2)\),需要矩阵 matrix 存储信息
执行用时 :44 ms, 在所有 Python3 提交中击败了30.40%的用户
内存消耗 :13.4 MB, 在所有 Python3 提交中击败了18.96%的用户

有效语法糖

1、Python声明matrix的方法

1
2
3
4
5
6
# 正确的方法
n = 3
mat = [[0 for _ in range(n)] for _ in range(n)]

# 错误的方法
matrix = [[0] * n] * n # 由于list是可变对象,这样声明,会导致矩阵第一行、第二行、第三行实际上都是内存中的同一个[0, 0, 0]对象。