题目信息
给你一个
m行n列的矩阵matrix,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:
m == matrix.lengthn == matrix[i].length1 <= m, n <= 10-100 <= matrix[i][j] <= 100
自写代码和思考
感觉做过啊感觉做过啊,之前练习csp的时候或者刷acwing的时候绝对做过类似的题目,这里直接可以手写一个版本,自写版本如下:
python
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res = []
# 感觉刷CSP的时候遇到过类似的题目...
# 先确定方向, 方向是先向右------>向下------>向左------>向上;然后往复
bias = [[0, 1], [1, 0], [0, -1], [-1, 0]]
m = len(matrix)
n = len(matrix[0])
boundarys = [n - 1, m - 1, 0, 0] # 四个方向的边界,和bias对齐(右、下、左、上)
boundary_bias = [-1, -1, 1, 1] # 到达边界以后的移动方向
pos = 0 # 记录当前的方向
i, j = 0, 0
while len(res) < m * n:
while j <= boundarys[0] and i <= boundarys[1] and j >= boundarys[2] and i >= boundarys[3]: #合法范围内
res.append(matrix[i][j])
i = i + bias[pos][0]
j = j + bias[pos][1]
# 需要变化方向
boundarys[pos] += boundary_bias[pos] # 首先更新边界
# 回退回最后一个合法的位置
i = i - bias[pos][0]
j = j - bias[pos][1]
pos += 1 #变化方向
pos %= 4
#往正确方向移动一步, 这是新方向上的首个未加入res的合法位置
i = i + bias[pos][0]
j = j + bias[pos][1]
return res
运行超时,但是自己也排查出逻辑错误了,重点在边界更新这里。
当到达右边界的时候,应该更新的是右边界吗?
不是的,接下来的方向是始终维持在该右边界向下移动的,如果改变了反而导致循环一直卡死在res的计数上面,所以这里有一个更新的逻辑错误。
到达右边界,更改的应该是上边界,此时已经扫完顶部的一行;
同理,到达下边界,更改的应该是右边界,因为最右侧的一列已经被扫完。依此类推..
修订后通过代码
修改边界更新规则就可以了
python
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res = []
# 感觉刷CSP的时候遇到过类似的题目...
# 先确定方向, 方向是先向右------>向下------>向左------>向上;然后往复
bias = [[0, 1], [1, 0], [0, -1], [-1, 0]]
m = len(matrix)
n = len(matrix[0])
boundarys = [n - 1, m - 1, 0, 0] # 四个方向的边界,和bias对齐(右、下、左、上)
pos = 0 # 记录当前的方向
i, j = 0, 0
while len(res) < m * n:
while j <= boundarys[0] and i <= boundarys[1] and j >= boundarys[2] and i >= boundarys[3]: #合法范围内
res.append(matrix[i][j])
i = i + bias[pos][0]
j = j + bias[pos][1]
# 需要变化方向
# 更新边界
if pos == 0: boundarys[3] += 1 # 向右走完,排除顶部
elif pos == 1: boundarys[0] -= 1 # 向下走完,排除右侧
elif pos == 2: boundarys[1] -= 1 # 向左走完,排除底部
else: boundarys[2] += 1 # 向上走完,排除左侧
# 回退回最后一个合法的位置
i = i - bias[pos][0]
j = j - bias[pos][1]
pos += 1 #变化方向
pos %= 4
#往正确方向移动一步, 这是新方向上的首个未加入res的合法位置
i = i + bias[pos][0]
j = j + bias[pos][1]
return res

