简说Python,号主老表,Python终身学习者,数据分析爱好者,从18年开始分享Python知识,原创文章227篇,写过Python、SQL、Excel入门文章,也写过Web开发、数据分析文章,老表还总结整理了一份2022Python学习资料和电子书资源,关注后私信回复:2022 即可领取。
一、写在前面
LeetCode 第十五题存在重复元素传输门:LeetCode015 :存在重复元素
今天给大家分享的是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 autopep8
(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)实际应用
实例源代码
1.实例代码
运行autopep方法
2.运行autopep8方法
运行后,仔细观察
3.运行后,仔细观察
应用起来还是很方便的,配置起来也不难,有助大家代码的可读性和优美性哦。
七、结语
今天分享的东西还比较多,希望大家坚持学习,我始终相信坚持终有所获,加我微信:zs820553471,备注:leetcode,加入专门的leetcode刷题交流群,回复:加群,可以加入简说Python学习交流群。
坚持 and 努力 : 终有所获。