程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

面试题-螺旋矩阵

发布于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],但该点已访问过,需要排除这种情况)

  1. class Solution(object):
  2. def spiralOrder(self, matrix):
  3. """
  4. :type matrix: List[List[int]]
  5. :rtype: List[int]
  6. """
  7. if not matrix:
  8. return []
  9. l = []
  10. R, C = len(matrix), len(matrix[0])
  11. r, c = 0, 0
  12. dr = [0, 1, 0, -1] # row的变化规则
  13. dc = [1, 0, -1, 0] # column的变化规则
  14. di = 0
  15. seen = [[False] * C for _ in matrix] # 设置标识,注意[False]
  16. for _ in range(R * C):
  17. l.append(matrix[r][c])
  18. seen[r][c] = True # 元素已访问
  19. nr, nc = r + dr[di], c + dc[di] # 下一个点
  20. if 0 <= nr < R and 0 <= nc <C and not seen[nr][nc]: # 未越界,且该点未访问过
  21. r, c = nr, nc
  22. else:
  23. di = (di + 1) % 4 # (撞墙了)改变步进方向
  24. r, c = r + dr[di], c + dc[di]
  25. return l

如果要求逆时针访问矩阵,那么将dr和dc对调即可(调整步进)

 

参考:

https://leetcode-cn.com/problems/spiral-matrix/solution/luo-xuan-ju-zhen-by-leetcode/

发布了12 篇原创文章 · 获赞 0 · 访问量 106


所属网站分类: 技术文章 > 博客

作者:爸爸去挣钱我去幼儿园

链接:https://www.pythonheidong.com/blog/article/232700/285c91cb5fab5ac16a6a/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

12 0
收藏该文
已收藏

评论内容:(最多支持255个字符)