leetcode 第十二天 2024.3.25

1. 前K个高频元素:
 题目链接: 347. 前 K 个高频元素 - 力扣(LeetCode)
应用条件:哈希表排序

难点:

这道题拿到手思路很好想,想到用哈希表来解决,但难点在于如何对哈希表进行排序,这需要我们用到python中的sorted函数。sorted 可以对各种可迭代的对象进行排序,支持自定义排序的键(key)和排序方向(升序或降序)。sorted使用方法如下:

sorted(iterable, *, key=None, reverse=False)

iterable: 需要排序的可迭代对象,如列表、元组、字典等。
key: (可选) 一个只接受一个参数的函数,用于从每个元素中提取一个用于比较的键(例如,通过提供lambda x: x[1]可以按元素的第二项排序)。默认值为None,即直接比较元素。
reverse: (可选) 布尔值,如果设置为True,则列表元素将被倒序排序,默认为False(升序排序)。

个人错误:

不会sorted。

思路:

如下

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        dic={}
        # res = []
        for i in nums:
            if i in dic:
                dic[i]+=1
            else:
                dic[i] = 1
        sorted_values = sorted(dic.items(), key=lambda item: item[1], reverse = True)
        res = [key for key, value in sorted_values[:k]]
        return res

方法二:小顶堆

难点:

没有小顶堆和大顶堆的应用概念,大小顶堆都是二叉树的变体,大顶堆每个节点都比其左右子节点大,小顶堆每个节点都比其左右子节点小。这道题让返回前K个最大的,注意我们需要使用小顶堆,因为顶堆中push操作后需要pop(pop出的都是根节点),使用小顶堆可以确保每次push后pop弹出的都是当前堆中最小的,所以剩下的就是前K个最大的。需要注意的是python中heapq实现的是小顶堆的模块,其操作如下:

创建一个空的堆
heap = []

向堆中添加一些元素
heapq.heappush(heap, 10)
heapq.heappush(heap, 5)
heapq.heappush(heap, 7)

# 现在堆是[5, 10, 7]
弹出并返回堆中最小的元素
smallest = heapq.heappop(heap)

如果我们想实现大顶堆,可以在将元素添加到堆之前,将它们的值取负。这样,原本较大的值会变成较小的值,因此在最小堆中的顶部会是原始值中的最大值的负数。在使用heapq.heappop()弹出元素时,再次将值取负,恢复其原始大小。

个人错误:

对堆没有任何的理解和概念。

思路:

如下

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        map_ = {} 
        for i in range(len(nums)):
            map_[nums[i]] = map_.get(nums[i], 0) + 1
        
        pri_que = [] 
        
        for key, freq in map_.items():
            heapq.heappush(pri_que, (freq, key))
            if len(pri_que) > k: 
                heapq.heappop(pri_que)
        
        result = [0] * k
        for i in range(k-1, -1, -1):
            result[i] = heapq.heappop(pri_que)[1]
        return result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值