标签:遍历 Matrix r1 r2 54 Spiral c2 c1 matrix
解法一:模拟
实现了按照 顺时针 方向遍历,通过dr、dc数组内元素的顺序实现,第一个元素是[0,1]就会向右不断遍历,第二个元素是[1,0]就会向下遍历,第三个元素是[0,-1]就会向左遍历,第四个元素是[-1,0]就会向上遍历,右下左上就是顺时针的方向。每一次只要下标超出范围,移动方向下标就会加一以改变遍历的方向。
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if not matrix:
return []
R, C = len(matrix), len(matrix[0])
ans = []
visited = [[False] * C for _ in matrix]
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
di = r = c = 0
for _ in range(R * C):
ans.append(matrix[r][c])
visited[r][c] = True
rr = r + dr[di]
cc = c + dc[di]
if 0 <= rr < R and 0 <= cc < C and not visited[rr][cc]:
r, c = rr, cc
else:
di = (di + 1) % 4
r = r + dr[di]
c = c + dc[di]
return ans
解法二:按层模拟
每一层不是由层数来标识,而是由左上角(r1, c1)和右下角(r2, c2)的坐标来标识以及迭代。其中有一点需要注意,为了防止最后一层只有一行或者一列,在向左和向上遍历之前需要先判断,判断语句如下:
if r1 < r2 and c1 < c2:
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
def spiral_coords(r1, c1, r2, c2):
for c in range(c1, c2 + 1):
yield r1, c
for r in range(r1 + 1, r2 + 1):
yield r, c2
if r1 < r2 and c1 < c2:
for c in range(c2 - 1, c1, -1):
yield r2, c
for r in range(r2, c1 , -1):
yield r, c1
if not matrix:
return []
ans = []
r1 = 0
c1 = 0
r2 = len(matrix) - 1
c2 = len(matrix[0]) - 1
while r1 <= r2 and c1 <= c2:
for r, c in spiral_coords(r1, c1, r2, c2):
ans.append(matrix[r][c])
r1 += 1
c1 += 1
r2 -= 1
c2 -= 1
return ans
标签:遍历,Matrix,r1,r2,54,Spiral,c2,c1,matrix 来源: https://blog.csdn.net/weixin_40801853/article/details/96476317
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。