54. 螺旋矩阵(剑指 Offer 29. 顺时针打印矩阵)

class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:ans = []count = 0m, n = len(matrix), len(matrix[0])length = m * ndirections = [(0, 1), (1, 0), (0, -1), (-1, 0)]x = y = Dir = 0while count < length:ans.append(matrix[x][y])matrix[x][y] = 'a'dx, dy = directions[Dir]if x + dx >= m or y + dy >= n or x + dx < 0 or y + dy < 0 or matrix[x + dx][y + dy] == 'a':Dir = Dir + 1 if Dir < 3 else 0dx, dy = directions[Dir]x += dxy += dycount += 1return ans

首先考虑到,元素前进的方向只有四个,对应方向的 x 与 y 如何变化是确定的。所以用一个direction 数组保存四个方向 [(0, 1), (1, 0), (0, -1), (-1, 0)]。另外要注意防止跑出界,每次准备跑出界时就转向。对于已经取过数的格子,把它置 ‘a’ 即可,下一格为 ‘a’ 就转向

59. 螺旋矩阵 II

class Solution:def generateMatrix(self, n: int) -> List[List[int]]:matrix = [[0] * n for _ in range(n)]directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]x = y = Dir = 0for i in range(1, n**2 + 1):matrix[x][y] = idx, dy = directions[Dir]if x + dx >= n or y + dy >= n or x + dx < 0 or y + dy < 0 or matrix[x + dx][y + dy] != 0:Dir = Dir + 1 if Dir < 3 else 0dx, dy = directions[Dir]x += dxy += dyreturn matrix

与上一题类似,区别在于本题不是给定矩阵求遍历序列,而是给定一个数字 n 然后返回一个 n**2 大小的矩阵。

885. 螺旋矩阵 III

class Solution:def spiralMatrixIII(self, rows: int, cols: int, rStart: int, cStart: int) -> List[List[int]]:ans= []directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]Left, Right, Upper, Bottom = cStart - 1, cStart + 1, rStart - 1, rStart + 1  # 四个方向的边界x, y, num, Dir = rStart, cStart, 1, 0  # (x, y)为当前节点,num为当前查找的数字,Dir为当前的方向while num <= rows * cols:if x >= 0 and x < rows and y >= 0 and y < cols:  # (x, y)在矩阵中ans.append([x, y])num += 1if Dir == 0 and y == Right:  # 向右到右边界Dir += 1    # 调转方向向下Right += 1  # 右边界右移elif Dir == 1 and x == Bottom:  # 向下到底边界Dir += 1Bottom += 1  # 底边界下移elif Dir == 2 and y == Left:  # 向左到左边界Dir += 1Left -= 1  # 左边界左移elif Dir == 3 and x == Upper:  # 向上到上边界Dir = 0Upper -= 1  # 上边界上移dx, dy = directions[Dir]x += dxy += dyreturn ans

本题可以看作是给定一个起始点,其上下左右为边界,然后开始顺时针遍历,如果元素正好在矩阵中,那就符合条件,加入到遍历序列 ans 中。如果遇到边界就把边界向外扩展,然后顺时针转向,再遍历下一个,直到把矩阵所有元素都遍历过为止。

矩阵模拟问题合集(Leetcode题解-Python语言)相关推荐

  1. 一般动态规划问题合集(Leetcode题解-Python语言)

    118. 杨辉三角 class Solution:def generate(self, numRows: int) -> List[List[int]]:dp = [[0] * i for i ...

  2. 回溯的问题合集(Leetcode题解-Python语言)

    78. 子集 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:ans = []cur = []def d ...

  3. 哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之中——实际应用

    上一节介绍了哈希表的原理与设计方法,这一节则直接python中现有的哈希表类型:哈希集合 set(集合)和哈希映射 dict(字典)来解决实际应用(刷题). 零.概念 在介绍实际应用之前,有一个概念我 ...

  4. 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)

    二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...

  5. 两数、三数、四数之和相关题目(Leetcode题解-Python语言)

    作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们. 1. 两数之和 class Solution:def twoSum(sel ...

  6. 字符串匹配经典题目——KMP算法(Leetcode题解-Python语言)

    28. 实现 strStr() strStr(haystack: str, needle: str) 的作用就是在 haystack 字符串(长度为 n)中找出 needle 字符串(长度为 m)出现 ...

  7. 队列的基础概念与经典题目(Leetcode题解-Python语言)

    队列是先入先出(后入后出)的数据结构,常用操作就 push 和 popleft,Python中用列表中的 pop(0) 或者 collection.deque的 popleft() 都可以. 普通队列 ...

  8. 在数组中找重复数、只出现一次的数或丢失数的题目(Leetcode题解-Python语言)

    在一维数组中的考察中,最常见的就是找出数组中的重复数.只出现一次的数或者丢失(消失)数等等. 一般来说,首先想到的就是用哈希表(集合)来记录出现过的数,基本所有的题都可以用集合来做,而技巧性在于有时可 ...

  9. 栈的基础概念与经典题目(Leetcode题解-Python语言)

    栈是先入后出(后入先出)的数据结构,常用操作就 push 和 pop,Python中用列表实现即可,基本概念可以看Leetbook相关章节. 普通栈 232. 用栈实现队列 class MyQueue ...

最新文章

  1. python中的方法需要定义_Python中规范定义命名空间的一些建议
  2. WindowsPE 第五章 导出表
  3. CPU访问计算机各组件周期
  4. bootstrap-nav属性详解
  5. ExtJS中如何根据combobox的选值,动态地决定组件的显隐?
  6. Air Data System
  7. CentOS操作系统(LAMP)安装教程
  8. linux套接字端口,多端口监听套接字linux(multiport listening socket linux)
  9. 网易逆水寒服务器型号,从服务器爆满到无人问津的经典游戏
  10. 纸上谈兵: 最短路径与贪婪
  11. Druid monitor中数据源只显示() property for user to setup(已解决)
  12. ceph12.0.1的源码编译安装
  13. springboot定时备份MYSQL_spring boot 定时备份数据库
  14. 使用postman发送post请求,header设置问题
  15. 深圳自己做网站 服务器,深圳自己做网站 服务器
  16. NTFS(文件恢复)最简单情况
  17. 光敏传感器实验报告_光敏传感器光电特性测量实验分析报告.ppt
  18. 腾讯云数据库SaaS致力于构建数据库分布式云,为更多更广的用户提供服务
  19. 移动编程基础知识(复习提纲)
  20. 说散就散乃是人生常态

热门文章

  1. 小组是什么意思_生猪期货什么时候上市?相关企业如何参与生猪期货
  2. 经典实用SQL语句大全汇总
  3. MarkDown之typora
  4. Android之matrix类控制图片的旋转、缩放、移动
  5. 【C语言简单说】二:第一个C语言程序详解(3)
  6. python代码加密解密_在python中加密 – 在Javascript中解密
  7. 软件配置管理(六)常用配置软件配置工具指令
  8. 和男朋友一块儿吃VS单独一人在家吃饭
  9. 每天20分钟,只需一年,一年级学生英语听力达到六年级水平!关键是坚持一点都不难!
  10. ensp查看历史配置命令_华为eNSP常用命令