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