矩阵模拟问题合集(Leetcode题解-Python语言)
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语言)相关推荐
- 一般动态规划问题合集(Leetcode题解-Python语言)
118. 杨辉三角 class Solution:def generate(self, numRows: int) -> List[List[int]]:dp = [[0] * i for i ...
- 回溯的问题合集(Leetcode题解-Python语言)
78. 子集 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:ans = []cur = []def d ...
- 哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之中——实际应用
上一节介绍了哈希表的原理与设计方法,这一节则直接python中现有的哈希表类型:哈希集合 set(集合)和哈希映射 dict(字典)来解决实际应用(刷题). 零.概念 在介绍实际应用之前,有一个概念我 ...
- 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)
二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...
- 两数、三数、四数之和相关题目(Leetcode题解-Python语言)
作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们. 1. 两数之和 class Solution:def twoSum(sel ...
- 字符串匹配经典题目——KMP算法(Leetcode题解-Python语言)
28. 实现 strStr() strStr(haystack: str, needle: str) 的作用就是在 haystack 字符串(长度为 n)中找出 needle 字符串(长度为 m)出现 ...
- 队列的基础概念与经典题目(Leetcode题解-Python语言)
队列是先入先出(后入后出)的数据结构,常用操作就 push 和 popleft,Python中用列表中的 pop(0) 或者 collection.deque的 popleft() 都可以. 普通队列 ...
- 在数组中找重复数、只出现一次的数或丢失数的题目(Leetcode题解-Python语言)
在一维数组中的考察中,最常见的就是找出数组中的重复数.只出现一次的数或者丢失(消失)数等等. 一般来说,首先想到的就是用哈希表(集合)来记录出现过的数,基本所有的题都可以用集合来做,而技巧性在于有时可 ...
- 栈的基础概念与经典题目(Leetcode题解-Python语言)
栈是先入后出(后入先出)的数据结构,常用操作就 push 和 pop,Python中用列表实现即可,基本概念可以看Leetbook相关章节. 普通栈 232. 用栈实现队列 class MyQueue ...
最新文章
- python中的方法需要定义_Python中规范定义命名空间的一些建议
- WindowsPE 第五章 导出表
- CPU访问计算机各组件周期
- bootstrap-nav属性详解
- ExtJS中如何根据combobox的选值,动态地决定组件的显隐?
- Air Data System
- CentOS操作系统(LAMP)安装教程
- linux套接字端口,多端口监听套接字linux(multiport listening socket linux)
- 网易逆水寒服务器型号,从服务器爆满到无人问津的经典游戏
- 纸上谈兵: 最短路径与贪婪
- Druid monitor中数据源只显示() property for user to setup(已解决)
- ceph12.0.1的源码编译安装
- springboot定时备份MYSQL_spring boot 定时备份数据库
- 使用postman发送post请求,header设置问题
- 深圳自己做网站 服务器,深圳自己做网站 服务器
- NTFS(文件恢复)最简单情况
- 光敏传感器实验报告_光敏传感器光电特性测量实验分析报告.ppt
- 腾讯云数据库SaaS致力于构建数据库分布式云,为更多更广的用户提供服务
- 移动编程基础知识(复习提纲)
- 说散就散乃是人生常态