原来散列函数就是哈希表啊,原来哈希表就是python中的字典啊!
phone = dict()
phone = {}
以上两种方法都能表示创建字典
phone["mama"] =12345
- "mama"是key,12345是值value
- 查找联系人的电话号码
value = phone.get("mama")
- 如果没有这个人则返回None,否则返回对应的value值
- 删除哈希表中的某个元素
del phone["mama"]
力扣题1
- 题目:
解析1:自定义比较函数
这个方法挺有意思,自己设置排序比较函数,因为题目要求按arr2中的元素排相对顺序嘛
class Solution:
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
def mycmp(x: int) -> (int, int):
return (0, rank[x]) if x in rank else (1, x)
rank = {x: i for i, x in enumerate(arr2)}
arr1.sort(key=mycmp)
return arr1
关于代码中不懂的问题
- 问题1:enumerate函数的使用https://blog.csdn.net/universe_1207/article/details/108551384
- 返回的i是索引,x是列表中的元素
- rank这里是字典,记录arr2中的元素在数组中的索引位置
- 问题2:sort函数https://www.runoob.com/python3/python3-att-list-sort.html
- sort函数中有俩参数
list.sort( key=None, reverse=False)
- key是指定可迭代对象中的一个元素来进行排序的参数
- reverse是排列顺序,True降序,False升序(默认)
- sort()函数的一个例子
strings = ['foo', 'card', 'bar', 'aaaa', 'abab']
# 根据字符串中不同字母的数量对一个字符串集合进行排序
strings.sort(key=lambda x: len(set(list(x))))
- 这里的lambda是匿名函数,x是变量名,改成啥都行,这里一串等于上面的mycmp函数
set()
函数,将字符串中每个字母分开,且会删除重复元素- 话说回来,这个mycmp函数目的是区分arr1里的两类元素:在arr2里的和不在的;如果arr1的元素x在arr2里,就按rank[x]排序(这个rank[x]是元素在arr2中的排序),否则按x的大小排
- 牛哇牛哇
- 这种方法的时间复杂度是 O ( n + m log m ) O(n+m\log m) O(n+mlogm),其中 m , n m,n m,n分别是arr1,arr2的元素个数, O ( n ) O(n) O(n)是构建哈希表的时间复杂度, O ( m log m ) O(m\log m) O(mlogm)则是arr1排序的时间复杂度,why?可能排序是快速排序法把
解析2:记录频率法(这种方法速度更快)
class Solution:
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
upper = max(arr1)
frequency = [0] * (upper + 1)
for x in arr1:
frequency[x] += 1
ans = list()
for x in arr2:
ans.extend([x] * frequency[x])
frequency[x] = 0
for x in range(upper + 1):
if frequency[x] > 0:
ans.extend([x] * frequency[x])
return ans
- 时间复杂度为 O ( m + n + u p p e r ) O(m+n+upper) O(m+n+upper)
- 关于生成固定长度的列表
frequency = [0] * (upper + 1)
- 将两个列表拼接在一起
list.extend(list)
- 在原来value的基础上加减
frequency[x] += 1