likes
comments
collection
share

螺旋矩阵 & 螺旋矩阵Ⅱ

作者站长头像
站长
· 阅读数 11

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

螺旋矩阵 & 螺旋矩阵Ⅱ

一、写在前面

LeetCode 第一题两数之和传输门:听说你还在写双层for循环解两数之和?

LeetCode 第二题两数之和传输门:两个排序数组的中位数,“最”有技术含量的解法!

LeetCode 第三题最长回文子串传输门:马拉车算法解最长回文子串!Manacher

LeetCode 第四题字符串转整数 (atoi):“愚公移山”的方法解atoi,自以为巧妙!

LeetCode 第五题最长公共前缀:继续解Leetcode,最长公共前缀

LeetCode 第六题三数之和:Leetcode“最经典”算法题之一:三数之和

LeetCode 第七题最接近的三数之和:最接近的三数之和,妙

LeetCode 第八题有效的括号:Leetcode有意思的一题:有效的括号

LeetCode 第九题删除排序数组中的重复项:LeetCode之删除排序数组中的重复项

LeetCode 第十题盛最多水的容器:盛最多水的容器,超有意思有技巧的Leetcode题

LeetCode 第十一题字符串相乘:Leetcode字符串相乘,你会怎么做?

LeetCode 第十二题反转字符串:Leetcode反转字符串,我又投机取巧啦!

LeetCode 第十三题反转字符串传输门:LeetCode013 : 反转字符串中的单词 III

LeetCode 第十四题反转字符串传输门:Leetcode再下一题,除自身以外数组的乘积

LeetCode 第十五题存在重复元素传输门:画个流程图解存在重复元素~

今天给大家分享的是LeetCode 数组与字符串 第十六题: 螺旋矩阵,和 第十七题:螺旋矩阵Ⅱ ,为面试而生,期待你的加入。

另外给大家讲一个Python编程小技能:自动规范代码autopep8的配置使用。

“Use the utility in the API is recommended in the project. But if you use it in an interview, you will definitely fail .”

Part 1

二、今日第一题

给定一个包含 m x n 个元素的矩阵(m 行, n 列), 请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

三、 分析

这个题目,看起来比较简单,但是难度还是有的,而且略微有点大,简单的一想,不就是转圈圈吗?从第一个元素开始转圈,每转一圈,圈的半径减小一个,转到遇到重复元素为止,对的,思想就是这样,怎么实现呢?你会吗?看下面老表的思路图解吧~

螺旋矩阵 & 螺旋矩阵Ⅱ

四、解题

表面上看,时间复杂度:O(n) 空间复杂度:O(n) (1)代码

class Solution(object):
	def spiralOrder(self, matrix):
		"""
		:type matrix: List[List[int]]
		:rtype: List[int]
		"""
		row = len(matrix)  # 行号
		col = len(matrix[0]) if row > 0 else 0  # 列号
		total = row * col  # 元素个数
		
		ans = []  # 存储结果
		i = 0
		while len(ans) < total:
			# 向右走,i 不变
			for rightcol in range(i, col - i):
				ans.append(matrix[i][rightcol])
			downrow = -1  # 越界标记
			# 向下走,rightcol 不变
			for downrow in range(i + 1, row - i):
				ans.append(matrix[downrow][rightcol])
			if downrow == -1:
				break
			icol = -1
			# 向左走,downrow 不变
			for icol in range(rightcol - 1, -1 + i, -1):
				ans.append(matrix[downrow][icol])
			if icol == -1:
				break
			# 向上走,icol 不变
			for uprow in range(downrow - 1, i, -1):
				ans.append(matrix[uprow][icol])
			i += 1 # 圈子缩小一格
		return ans

(2)提交结果 螺旋矩阵 & 螺旋矩阵Ⅱ

测试数据:22组运行时间:24ms击败人百分比:99.71%

Part 2

一、今日第二题

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素, 且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

二、 分析

这个题目,和上一个题目刚好是逆过来的,从二维矩阵变成一维,从一维变成二维,相同点是数据都是给定的, 螺旋矩阵 & 螺旋矩阵Ⅱ

三、解题

表面上看,时间复杂度:O(n) 空间复杂度:O(n) (1)代码

class Solution(object):
	def generateMatrix(self, n):
		"""
		:type n: int
		:rtype: List[List[int]]
		"""
		ans = [[0] * n for i in range(n)]  # 螺旋矩阵
		total = n * n  # 总元素个数
		i = 0 # 开始下标
		j = 1  # 记录元素值
		
		while j <= total:
			# 向右走
			for rightcol in range(i, n - i):
				ans[i][rightcol] = j
				j += 1
			downrow = -1 # 越界标记
			# 向下走
			for downrow in range(i + 1, n - i):
				ans[downrow][rightcol] = j
				j += 1
			if downrow == -1:
				break
			icol = -1
			# 向左走
			for icol in range(rightcol - 1, -1 + i, -1):
				ans[downrow][icol] = j
				j += 1
			if icol == -1:
				break
			# 向上走
			for uprow in range(downrow - 1, i, -1):
				ans[uprow][icol] = j
				j += 1
			i += 1 # 圈子减一
		return ans

(2)提交结果 螺旋矩阵 & 螺旋矩阵Ⅱ

测试数据:20组运行时间:28ms击败人百分比:98.21%

Part 3

小技能:Python自动规范代码autopep8使用

(1)模块安装
pip install outopep8
(2)配置到Pyecharm

Pycharm - > File - > Setting - > Tools - > External Tools ,然后输入下面图中的基本内容,为了方便大家,我把基本固定不变的内容直接贴出来: Program : autopep8 Arguments : --in-place --aggressive --aggressive $FilePath$ Working directory : $FileDir$ Output filters : $FILE_PATH$\:$LINE$\:$COLUMN$\:.*

螺旋矩阵 & 螺旋矩阵Ⅱ

(3)实际应用

实例源代码 螺旋矩阵 & 螺旋矩阵Ⅱ 运行autopep方法 螺旋矩阵 & 螺旋矩阵Ⅱ 运行后,仔细观察 螺旋矩阵 & 螺旋矩阵Ⅱ 应用起来还是很方便的,配置起来也不难,有助大家代码的可读性和优美性哦。

我相信坚持,总会有收获,我不就收获了你们的支持吗!

思想很复杂, 实现很有趣。 只要不放弃, 终有成名日。 ---《老表打油诗》

点赞 在看 留言 转发 ,四连支持,原创不易。好的,那么下期见,我是爱猫爱技术,更爱思思的老表⁽⁽ଘ( ˙꒳˙ )ଓ⁾⁾