螺旋矩阵
59. 螺旋矩阵II
# 方法一
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
NMatrix = [[0 for i in range(n)] for j in range(n)]
nums = [i for i in range(1, n**2 + 1)]
l = (n - 1)//2 + 1 # 计算圈数
for i in range(l):
for j in range(n-i*2): # 计算圈的上侧填充数组
NMatrix[i][i+j] = nums[0]
nums.pop(0)
for j in range(n-2*i-1):
NMatrix[i+j+1][n-i-1] = nums[0] # 计算圈的右侧填充数组
nums.pop(0)
for j in range(n-2*i-1):
print(i,j)
NMatrix[n-i-1][n-j-i-2] = nums[0] # 计算圈的下侧填充数组
nums.pop(0)
for j in range(n-i*2-2):
NMatrix[n-j-i-2][i] = nums[0] # 计算圈的左侧填充数组
nums.pop(0)
return NMatrix
# 方法二
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums = [[0] * n for _ in range(n)]
startx, starty = 0, 0 # 起始点
loop, mid = n // 2, n // 2 # 迭代次数、n为奇数时,矩阵的中心点
count = 1 # 计数
for offset in range(1, loop + 1) : # 每循环一层偏移量加1,偏移量从1开始
for i in range(starty, n - offset) : # 从左至右,左闭右开
nums[startx][i] = count
count += 1
for i in range(startx, n - offset) : # 从上至下
nums[i][n - offset] = count
count += 1
for i in range(n - offset, starty, -1) : # 从右至左
nums[n - offset][i] = count
count += 1
for i in range(n - offset, startx, -1) : # 从下至上
nums[i][starty] = count
count += 1
startx += 1 # 更新起始点
starty += 1
if n % 2 != 0 : # n为奇数时,填充中心点
nums[mid][mid] = count
return nums
备注: 方法一中要注意的是 每一圈的每一层,他一共需要填充多少个数(多少个j),每次填充的下标如何通过i,n,j来表示,比较麻烦。方法二对其进行的优化,使得下标都可以通过固定的规律来表示
54. 螺旋矩阵
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
h , l = len(matrix), len(matrix[0])
nums = []
c = 0 # 定义圈数
while len(nums) < h * l:
for k in range(l-2*c):
nums.append(matrix[c][k+c])
if h-2*c-1 == 0:
break
for k in range(h-2*c-1):
nums.append(matrix[c+k+1][l-c-1])
if l-2*c-1 == 0:
break
for k in range(l-2*c-1):
nums.append(matrix[h-1-c][l-k-c-2])
for k in range(h-2*c-2):
nums.append(matrix[h-2-c-k][c])
c += 1
return nums
备注: 我做这个题目就是先确定好圈,确定每圈的每一条边的指针的起始点以及移动次数,然后通过while不断缩小圈