给定m*n矩阵,以螺旋式的顺序返回矩阵中的所有元素
Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
由题意,可将问题视为选择不同起点,并依次绕矩阵顺时针旋转一周,如Example 1中需绕两周,起点分别为1和5,其中5所绕的圈只有其本身。显然需确定绕圈的圈数、每次绕圈的边界即可。
绕圈圈数: c=(min(m,n)+1)//2 c = ( m i n ( m , n ) + 1 ) / / 2
绕圈起点: (k,k)while0<=k<c ( k , k ) w h i l e 0 <= k < c
绕圈边界:根据起点与m、n的关系确定
class Solution:
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
res = []
if len(matrix) == 0 or len(matrix[0]) == 0:
return res
n, m = len(matrix), len(matrix[0])
c = min(n, m) #确定圈数
for i in range(0, (c + 1) // 2):
#append the ith circle
res += matrix[i][i: m - i] #左到右
for j in range(i + 1, n - i): #上到下
res.append(matrix[j][m - i - 1])
if n - i - 1 != i: #判断是否与左到右重复
for j in range(m - i - 2, i - 1, -1): #右到左
res.append(matrix[n - i - 1][j])
if m - i - 1 != i: #判断是否与上到下重复
for j in range(n - i - 2, i, -1): #下到上
res.append(matrix[j][i])
return res
给定一个整数n,生成一个方阵,其元素为 [1,n2] [ 1 , n 2 ] 的数字以螺旋式填充至方阵中
Input: 3
Output:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
在Spiral Matrix的基础上,增加一个count变量,每次走到一个位置,将count赋值给对应位置并自增即可。
class Solution:
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
if n == 0:
return []
row = [0 for i in range(0, n)]
res = [row[:] for i in range(0, n)]
count = 0 #生成方阵及count变量
for i in range(0, (n + 1) // 2): #依次循环每一圈
#append the ith circle
for j in range(i, n - i): #左到右
count += 1
res[i][j] = count
for j in range(i + 1, n - i): #上到下
count += 1
res[j][n - i - 1] = count
if n - i - 1 != i: #判断是否与左到右、上到下重复
for j in range(n - i - 2, i - 1, -1): #右到左
count += 1
res[n - i - 1][j] = count
for j in range(n - i - 2, i, -1): #下到上
count += 1
res[j][i] = count
return res