为了熟练python和算法,此次使用Python3刷题。由于过往Python多半直接使用,基础了解极少,刷题同时会记录一些Python有关的知识点。
目录
Python
基础内容
函数名相关
self:
Python规定在类下,函数的第一个参数是实例对象本身。1
__init__():
两个下划线开头的函数是私有函数,外部无法使用或访问。init函数主要用于初始化类中变量。
函数中的->:
用于标记该函数返回值的类型。
List
顺序表:2
顺序表即按照顺序将数据地址连续的存储在内存的一处地方。有两种结构的顺序表:一体式结构和分离式结构。
为了在内存中开辟一块区域来连续存放就需要告诉它要多少地,如果后续数据溢出还需要重新申请空间。
一体式结构顺序表:将头信息(容量、目前元素个数)和元素数据放在一起。
优点:整体性强,易于管理。
缺点:扩充时,头信息和元素需要一起切换到新区域。需要更改顺序表对象。
分离式结构顺序表:将头信息和元素分开存放,并将元素地址给头信息从而建立链接。
优点:扩充时,只要修改头信息后的链表地址,使得顺序表对象地址无需改变。
List数据结构:
Python的list结构是一种分离式技术的动态顺序表,是Stack。
List扩充:
1.线性增长:每次扩充固定数量的存储位置。优点:节省空间。缺点:遇到扩充大空间时,操作次数多。(时间换空间)
2. 指数增长:每次扩充的容量加倍。优点:操作次数少,但浪费空间资源。(空间换时间)
List寻址:
由于list可以存储不同类型数据,所有有两种寻址方法。
1.存储相同类时:相同类型所占字节一致,可以根据逻辑和物理地址计算偏移量寻址,时间复杂度O(1)
2. 存储不同类型:由于字节数不同,所以此时存储元素地址,元素外置。时间复杂度O(1)。
其他:
内置函数len()的时间复杂度也是O(1),因为底层会维护一个size变量,在append时候就做记录。
剑指Offer
归纳类型,题目解释,多种做法
Stack&Queue
剑指09
基本思路:stack1存储,stack2辅助删除。
方法1:自己的拉胯方法。把CQueue完全当成queue来处理,遇到删除时,stack1所有内容反向推给stack2,除了最后一个,然后再从stack2反向推给stack1,维持次序。
时间复杂度:O(n),两次for循环。
方法2:好一点的方法。把两个stack分开看,第一次出现delete,就把stack1的内容反向推给stack2,除了最后一个。这样保证在这次delete之前的内容都已经反向,stack2只要pop就一定是队头。即使在stack2中还有内容时,我们往stack1中append也不影响stack2的delete。
什么时候返回-1,就是在stack2中没有delete了,然后发现stack1中也没内容反推至stack2了。
时间复杂度:O(n),一个循环
剑指30
基本思路:一个主要stack存数据,一个辅助栈aux帮助减少找到最小值的时间复杂度。
方法1:第一反应,啥玩意啊,一个min()完事了,O(n)也不错了。
方法2:好吧要O(n)还要我写算法干什么,那就想怎么去除min()的O(n)变成O(1)。
top不用说直接[-1]或者peek()进行返回;push的时候用辅助aux来及记录当前情况下stack的最小值;pop的时候stack正常pop,然后存储此值来和aux最后一个值做对比,看是否pop了当前最小值,是的话aux也要pop;min直接返回aux的最后一个值。
图在pad上,待画