发布于2020-02-24 22:57 阅读(657) 评论(0) 点赞(12) 收藏(3)
题目来源:https://leetcode-cn.com/submissions/detail/48952119/
注:同思路题 https://leetcode-cn.com/problems/spiral-matrix-ii/
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
顺时针访问矩阵的顺序为(1,n) -> (m,n) -> (m, 1) -> (2, 1) -> (2, m-1) ……观察这个过程,为行和列分别设置一个方向步长数组。
为矩阵中每个元素都设置一个标识,如果元素已经访问过,就改变标识。记seen[r][c]为第r行第j列的元素是否已访问的标识,主要是为了避免转向后重复访问已访问过的元素。(如最外一圈结束后,又会回到matrix[0][0],但该点已访问过,需要排除这种情况)
- class Solution(object):
- def spiralOrder(self, matrix):
- """
- :type matrix: List[List[int]]
- :rtype: List[int]
- """
- if not matrix:
- return []
- l = []
- R, C = len(matrix), len(matrix[0])
- r, c = 0, 0
- dr = [0, 1, 0, -1] # row的变化规则
- dc = [1, 0, -1, 0] # column的变化规则
- di = 0
- seen = [[False] * C for _ in matrix] # 设置标识,注意[False]
- for _ in range(R * C):
- l.append(matrix[r][c])
- seen[r][c] = True # 元素已访问
- nr, nc = r + dr[di], c + dc[di] # 下一个点
- if 0 <= nr < R and 0 <= nc <C and not seen[nr][nc]: # 未越界,且该点未访问过
- r, c = nr, nc
- else:
- di = (di + 1) % 4 # (撞墙了)改变步进方向
- r, c = r + dr[di], c + dc[di]
- return l
如果要求逆时针访问矩阵,那么将dr和dc对调即可(调整步进)
参考:
https://leetcode-cn.com/problems/spiral-matrix/solution/luo-xuan-ju-zhen-by-leetcode/
作者:爸爸去挣钱我去幼儿园
链接:https://www.pythonheidong.com/blog/article/232700/285c91cb5fab5ac16a6a/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!