Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
Input: 3
Output:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
Very similar to Spiral matrix 1
def generateMatrix(self, n: 'int') -> 'List[List[int]]':
c_start = 0
c_end = n - 1
r_start = 0
r_end = n - 1
res = [ [1 for i in range(n)] for i in range(n) ]
ctr = 1
while r_start <= r_end and c_start <= c_end:
for i in range(c_start, c_end + 1):
res[r_start][i] = ctr
ctr += 1
for i in range(r_start + 1, r_end + 1):
res[i][c_end] = ctr
ctr += 1
for i in range(c_end - 1, c_start, -1):
res[r_end][i] = ctr
ctr += 1
for i in range(r_end, r_start, - 1):
res[i][c_start] = ctr
ctr += 1
c_start += 1
c_end -= 1
r_start += 1
r_end -= 1
Watch out
Partition of matrix
We partition the outmost layer of matrix into n ( the top horizontal), two n – 1( two vertical) and one n – 2 group ( the bottom horizontal).
EG
1 2 3
8 9 4
7 6 5
123 belongs to the first group, 4,5 and 8,7 belong to the vertical group, and 6 belong to the bottom horizontal group.
This partition has one advantage: It deals with the edge case when the matrix is a singleton.
In that case, all group but the first group is empty.