哈希表(字典),sort,set


原来散列函数就是哈希表啊,原来哈希表就是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

关于代码中不懂的问题

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

universe_1207

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值