[LeetCode - Python]剑指 Offer 40. 最小的k个数(Easy);1122.数组的相对排序(Easy)

1.题目链接:

剑指 Offer 40. 最小的k个数(Easy)
在这里插入图片描述

1.代码:

class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        arr.sort()
        return arr[:k]

通过图:
过于简短,没啥想法。。。
在这里插入图片描述

2.题目链接:

1122.数组的相对排序(Easy)
在这里插入图片描述

2.代码:

class Solution:
    def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
        #初始思路
        #看到arr2 元素各不相同,arr1 元素允许相同,默认想到哈希表;
        #思路:以arr2为哈希表基础,默认值为0,遍历arr1,存在+1,不存在添加
        #问题:最后不会输出。。

        #新思路         计数排序
        #单独顶一个MAX 1001的 纯0数组,用于统计数字出现频率
        #三次遍历:
        #用于实现类似哈希表一样的效果

        Num = [0 for _ in range(1001)]     #生成用于计数的MAX 1001的纯0数组,0为幅值,_ 代表并不关心中间变量的赋值
        Ret = []                    #用于返回的空数组
        #1.第一次遍历。因为 1000>=arr1中元素>=0,所以用索引数来代表arr1中元素的值,索引数对应的值代表出现次数
        for i in arr1:              
            Num[i]+=1
        #2.第二次遍历。用arr2的元素顺序,Num统计的个数,为Ret数组赋值。 
        for i in arr2:
            #List += [a]*[N],会将List后边添加,N个a元素
            Ret += [i]*Num[i]
            Num[i] = 0
        #3.第三次遍历。将未在arr2中的元素,以统计得到的次数为准,按顺序为Ret赋剩余值。
        for i in range(len(Num)):
            Ret += [i]*Num[i]            #遇到次数为0(已添加),则跳过;
        return Ret

一把血泪跟总结,都在注释里。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值