小白刷刷刷 59 ~ 旋转的矩阵 2
基本信息
- 题号:59
- 题厂:微软
- 难度系数:中

解题思路
在 n * n 的正方形矩阵中按顺时针螺旋方式填入 1 ~ n^2
- 我们可以先创建一个 n * n 的空白矩阵,再按顺时针旋转思路对号填入数字。
- 每到拐点(左上,右上,左下,右下)四个角时,改变旋转方向。
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
# 创建 n * n 空白矩阵
matrix = [[0] * n for i in range(n)]
# 上、下、左、右 边界
t, b, l, r = 0, n - 1, 0, n - 1
# i 为填入数字,从 1 开始填
i = 1
# 当前行、列 index 号,从 [0][0] 开始填
cur_r, cur_c = 0, 0
while l <= r and t <= b:
# 从左往右填,每填一次 i + 1,当前列往右移动一格,直到矩阵最右列跳出循环
while cur_c < r and cur_r == t:
matrix[cur_r][cur_c] = i
i += 1
cur_c += 1
# 填完之后,top 边界 + 1,已备下次循环旋转时判断
t += 1
# 沿着最右边界,从上往下填。。。每一次行数 + 1 而列数不变
while cur_r < b and cur_c == r:
matrix[cur_r][cur_c] = i
i += 1
cur_r += 1
r -= 1
# 重复以上步骤,沿着下边界从右往左填。。。
while cur_r == b and cur_c > l:
matrix[cur_r][cur_c] = i
i += 1
cur_c -= 1
b -= 1
# 沿左边界,由下往上填
while cur_r > t and cur_c == l:
matrix[cur_r][cur_c] = i
i += 1
cur_r -= 1
l += 1
# 不要忘了,跳出循环后,最后一个格子还没有填。。。
matrix[cur_r][cur_c] = i
return matrix
Constraints
- 题目限制
1 <= n <= 20
考试时,向考官确认 n 的取值范围。
Big O
- Time:O(n^2)
- space:因为创建矩阵,自然复杂度为 O(n^2)
测试
- 常规测试:n == 某奇数;n == 某偶数
- 边界测试: 当 n == 1 时的特殊案例; n == 20 时,算法是否效率够快
总结
- 微软著名旋转矩阵系列题,中规中矩中档难度题。
- 旋转矩阵问题在思路上,解体思路不难分析。
- 此类问题在于处理转角时,最后一个格子不算,从而实现数组不越界又不漏掉格子
