题目要求:
给定一个矩阵,按螺旋顺序输出各个元素
例子:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
思路:
模拟螺旋线路,进行循环
每个大循环中嵌套四个小循环
分别输出该次循环右下左上顺序历遍的元素
即 最外层循环中包括
右向循环输出123
下循环输出69
左循环输出87
上循环输出4
实现:
思路很简单,但是对于循环边界的确定需要仔细思考,防止重复,遗落或者下标越界
定义now_row now_col两个变量,记录当前循环开始位置所处于的行列号。
然后根据规律,每次循环和上次循环,必定有行或者列之一保持一直,剩下的一个坐标为前一次坐标的±1范围。整个循环的终止条件为输出长度等于矩阵中总的元素数量
还有就是每次输出之后,那下一次行或列的长度,就需要减一以防止输出重复元素
代码
class Solution:
def spiralOrder(self, matrix):
m = 0
now_r = 0
row_lenth = len(matrix)
col_lenth = len(matrix[0])
all_num = row_lenth*col_lenth
now_c = 0
res = []
while(len(res)<all_num):
for j in range(now_c,now_c+col_lenth):
res.append(matrix[m][j])
if len(res) == all_num:
break
now_r = m+1
row_lenth-=1
for p in range(now_r,now_r+row_lenth):
res.append(matrix[p][j])
if len(res) == all_num:
break
now_c = j-1
col_lenth-=1
for q in range(now_c,now_c-col_lenth,-1):
res.append(matrix[p][q])
if len(res) == all_num:
break
now_r = p-1
row_lenth-=1
for m in range(now_r,now_r-row_lenth,-1):
res.append(matrix[m][q])
if len(res) == all_num:
break
now_c = q +1
col_lenth-=1
return res
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
print(Solution().spiralOrder(matrix))