字符串这里如果用 python 写,会跳过很多算法的思想,因为 python 就算不调用库函数,用列表存储字符串也是非常的方便,不需要像 C++ 那样各种双指针扩写。最麻烦的应该是子字符串匹配算法,也就是大名鼎鼎的 KMP 算法,这个算法网上已经有很多教程了,我把我看过的比较好的链接都放在这里。
KMP 算法
大约 2 分钟
字符串这里如果用 python 写,会跳过很多算法的思想,因为 python 就算不调用库函数,用列表存储字符串也是非常的方便,不需要像 C++ 那样各种双指针扩写。最麻烦的应该是子字符串匹配算法,也就是大名鼎鼎的 KMP 算法,这个算法网上已经有很多教程了,我把我看过的比较好的链接都放在这里。
有关链表的基础结构,我已经写在了博客的数据结构栏目里,具体的 C++ 代码可以查看仓库。ref
链表里面涉及的算法主要是双指针和递归。
链表数据在内存里不是连续分布的,而是离散分布,通过指针指向另外一个内存地址。也就是说,我只要知道了一个链表头结点的地址,我就能依次拎起整个链表,而不需要像数组那样,把整个数据块都告诉我。但是也由于链表的指针特性,导致链表只能单向查找 (或者构建双向链表实现双向的查找),链表查找数据的时间复杂度达到了O(n)。
二分查找的模板代码:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1 # 定义 target 在左闭右闭的区间里,[left, right]
while left <= right:
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle - 1 # target 在左区间,所以 [left, middle - 1]
elif nums[middle] < target:
left = middle + 1 # target 在右区间,所以 [middle + 1, right]
else:
return middle # 数组中找到目标值,直接返回下标
return -1 # 未找到目标值
感谢代码随想录提供的力扣刷题顺序,我按照代码随想录上给的题目顺序刷题,但是发现他上面也有很多解答不够详细的地方,根据我的理解我会在博客内进行补充
哈希表:主要针对根据特征进行分类的问题
dict()
or {}
):python 中的字典就是哈希表,存储了多个键值对,其中“键”可以是字符串,也可以是int
型整数list()
or []
):python 中的列表其实是一种特殊的字典形式,该字典的键是下标索引,值是列表中每个索引对应的值collections.Counter(list)
:计数器,是封装好的哈希表函数,调用时的输入参数是一个列表,该函数会返回一个字典,字典中存储各项值在列表中的出现次数,也是一个哈希表。在使用前需要import collections
导入需要的库。