【LeetCode】54. Spiral Matrix 解题报告(Python)
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode.com/problems/spiral-matrix/description/
题目描述
Given a matrix of m x n
elements (m rows, n columns), return all elements of the matrix in spiral order.
Example 1:
Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
题目大意
顺时针螺旋着打印二维矩阵。
解题方法
维护四个边界和运动方向
螺旋打印,一定会在遍历的时候更改方向。在什么时候更改方向呢?在最外圈运动的时候是到达边界的时候。但是当移动到Example 1中4的位置时,要向右移动(而不是向上),那么相当于上边界已经移动了第二行。
同理,我们推断:
我们维护四个边界left, right, up, down,表示尚未走过的、可以移动的矩阵范围,起始时四个边界即矩阵的边界。当每次遇到新的边界的时候,需要把移动方向顺时针旋转90度,同时把刚刚走过的那个边界线(这条边界线上所有元素已经遍历过)需要向矩阵内移动,即缩小了边界。当所有的位置都被遍历了一次,则停止。
python代码如下,核心是每次遇到新的边界时,顺时针修改移动方向,并且将老边界内移。
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if not matrix or not matrix[0]: return []
M, N = len(matrix), len(matrix[0])
left, right, up, down = 0, N - 1, 0, M - 1
res = []
x, y = 0, 0
dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]
cur_d = 0
while len(res) != M * N:
res.append(matrix[x][y])
if cur_d == 0 and y == right:
cur_d += 1
up += 1
elif cur_d == 1 and x == down:
cur_d += 1
right -= 1
elif cur_d == 2 and y == left:
cur_d += 1
down -= 1
elif cur_d == 3 and x == up:
cur_d += 1
left += 1
cur_d %= 4
x += dirs[cur_d][0]
y += dirs[cur_d][1]
return res
保存已经走过的位置
一个比较蠢的实现方式:使用一个二维数组保存哪些走过了。这样遍历的时候,如果发现走过了就停止。因为while断开了,所以在当前的循环方向上要回退一格,然后移动行、列。
真的比较蠢 23333
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if not matrix or not matrix[0]: return []
m, n = len(matrix), len(matrix[0])
visited = [[0] * n for _ in range(m)]
res = []
self.row, self.col = 0, 0
def spiral():
move = False
while self.col < n and not visited[self.row][self.col]:
res.append(matrix[self.row][self.col])
visited[self.row][self.col] = 1
self.col += 1
move = True
self.col -= 1
self.row += 1
while self.row < m and not visited[self.row][self.col]:
res.append(matrix[self.row][self.col])
visited[self.row][self.col] = 1
self.row += 1
move = True
self.row -= 1
self.col -= 1
while self.col >= 0 and not visited[self.row][self.col]:
res.append(matrix[self.row][self.col])
visited[self.row][self.col] = 1
self.col -= 1
move = True
self.col += 1
self.row -= 1
while self.row >= 0 and not visited[self.row][self.col]:
res.append(matrix[self.row][self.col])
visited[self.row][self.col] = 1
self.row -= 1
move = True
self.row += 1
self.col += 1
if move:
spiral()
spiral()
return res
日期
2018 年 3 月 13 日
2019 年 9 月 13 日 —— 一年半后的做法明显变得简单了~
【LeetCode】54. Spiral Matrix 解题报告(Python)的更多相关文章
- 【LeetCode】01 Matrix 解题报告
[LeetCode]01 Matrix 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/01-matrix/#/descripti ...
- Leetcode 54:Spiral Matrix 螺旋矩阵
54:Spiral Matrix 螺旋矩阵 Given a matrix of m x n elements (m rows, n columns), return all elements of t ...
- Leetcode 54. Spiral Matrix & 59. Spiral Matrix II
54. Spiral Matrix [Medium] Description Given a matrix of m x n elements (m rows, n columns), return ...
- LeetCode - 54. Spiral Matrix
54. Spiral Matrix Problem's Link ------------------------------------------------------------------- ...
- leetcode 54. Spiral Matrix 、59. Spiral Matrix II
54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置 54. Spiral Matrix start表示的是每次一圈的开始,每次开始其实就是从(0,0).(1,1 ...
- LeetCode: Spiral Matrix 解题报告
Spiral MatrixGiven a matrix of m x n elements (m rows, n columns), return all elements of the matrix ...
- leetCode 54.Spiral Matrix(螺旋矩阵) 解题思路和方法
Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...
- [array] leetcode - 54. Spiral Matrix - Medium
leetcode-54. Spiral Matrix - Medium descrition GGiven a matrix of m x n elements (m rows, n columns) ...
- LeetCode 54. Spiral Matrix(螺旋矩阵)
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
随机推荐
- LeetCode替换空格
LeetCode 替换空格 题目描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 实例 1: 输入:s = "We are happy." 输 ...
- 试了下GoAsm
在VC里我们: #include <windows.h> DWORD dwNumberOfBytesWritten; int main() { HANDLE hStdOut = GetSt ...
- Spark中的分区方法详解
转自:https://blog.csdn.net/dmy1115143060/article/details/82620715 一.Spark数据分区方式简要 在Spark中,RDD(Resilien ...
- 如果你不想让pthread_join阻塞你的进程,那么请调用pthread_detach
如果你不想让pthread_join阻塞你的进程,那么请调用pthread_detach 2016年01月13日 16:04:20 炸鸡叔 阅读数:7277 转发自:http://baike.ba ...
- js处理title超长问题
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- shell条件测试语句实例-测试apache是否开启
终于理解了shell条件测试语句"!="和"-n"的用法区别,于是有了如下的shell脚本,做为练习. 第一种方法:测试apache是否开启?字符串测试 #!/ ...
- ES在项目中的测试
1.application.yml server: port: ${port:40100}spring: application: name: xc-search-servicexuecheng: e ...
- Jmeter——脱离Jenkins后,Ant集成邮件通知
之前搭建在本地的Jenkins环境,由于重装系统的原因,环境不能用了.在用jmeter做测试的时候,索性用本地ant构建,运行下来也一样平稳. 结合Jenkins搭建环境,可以参考博文:Jenkins ...
- [BUUCTF]PWN——inndy_rop
inndy_rop 附件 步骤: 例行检查,32位,开启了nx保护 本地调试运行没看出个啥,直接上ida,一开始f5会报错, 找到报错提示的位置,点击option–>general调出如图的界面 ...
- 【python】青果教务系统模拟登陆
使用 python 的 selenium + chrome 来模拟登陆学校教务系统 完整代码传至 github,增加了一个自动识别验证码的功能,不过是用的别人的轮子,识别度也不高 这是需要手动输入验证 ...