347. 前 K 个高频元素 python

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

# 以下为自己学完之后写的版本
import heapq
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        map_ = {}
        for item in nums:
            map_[item] = map_.get(item, 0) + 1
        pri_que = []
        # for (key, freq) in map_: ✖
        for (key, freq) in map_.items():
            if len(pri_que) < k:
                heapq.heappush(pri_que, (freq, key))
            else:
                
                heapq.heappush(pri_que, (freq, key))
                heapq.heappop(pri_que)
                # 必须先push再pop,否则不对。
        return [i[1] for i in pri_que]

# # python内置模块 --- heapq:实现了一个小根堆。
# # 模块内常见的操作函数:
# # 1. heapify(x) :    将列表x转换为堆(小根堆)。
# # 2. heappush(heap,item): 将item压入堆中。(heap使存放堆的数组)
# # 3. heappop(heap): 从堆中弹出最小的项,并将其值返回。
# # heapq堆数据结构最重要的特征是heap[0]永远是最小的元素
# # ————————————————
# # heapq.heapify(list)
# # 将列表转换为最小堆 ,转换完后仍然是列表,所以heapify只是对列表中的元素进行了堆属性的排序

# # import heapq
# # res=[7,1,5,4,2,3]
# # print("列表",res,type(res))     #列表 [7, 1, 5, 4, 2, 3] <class 'list'>
# # heapq.heapify(res)
# # print("最小堆",res,type(res))   #最小堆 [1, 2, 3, 4, 7, 5] <class 'list'>
# # ————————————————
# # heapq.heappush(heap, item)
# # 将元素item压入heap堆(列表)中

# # import heapq
# # res=[7,1,5,6,2,3]
# # heapq.heapify(res)
# # heapq.heappush(res,8)
# # print("最小堆",res,type(res))   #最小堆 [1, 2, 3, 6, 7, 5, 8] <class 'list'>
# # ————————————————
# # heapq.heappop(heap) 
# # 删除并返回最小值,因为堆的特征是heap[0]永远是最小的元素,所以一般都是删除第一个元素。故,需要先通过heapify(list) 将list转变为heap。

# # import heapq
# # res=[7,1,5,6,2,3]
# # print("列表",res,type(res))      #列表 [7, 1, 5, 6, 2, 3] <class 'list'>
# # heapq.heapify(res)
# # min_d=heapq.heappop(res)
# # print(min_d)                     #1
# # print("最小堆",res,type(res))    #最小堆 [2, 5, 3, 6, 7] <class 'list'>
# # ————————————————

# #时间复杂度:O(nlogk)
# #空间复杂度:O(n)
# import heapq
# class Solution:
#     def topKFrequent(self, nums: List[int], k: int) -> List[int]:
#         #要统计元素出现频率
#         map_ = {} #nums[i]:对应出现的次数
#         for i in range(len(nums)):
#             map_[nums[i]] = map_.get(nums[i], 0) + 1 
#             # (nums[i], 0)指的是有值则返回值,无值则返回0。
        
#         #对频率排序
#         #定义一个小顶堆,大小为k
#         pri_que = [] #小顶堆
        
#         #用固定大小为k的小顶堆,扫描所有频率的数值
#         for key, freq in map_.items():
#             heapq.heappush(pri_que, (freq, key))
#             if len(pri_que) > k: #如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
#                 heapq.heappop(pri_que)
#         return [i[1] for i in pri_que]
#         # #找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
#         # result = [0] * k
#         # for i in range(k-1, -1, -1):
#         #     result[i] = heapq.heappop(pri_que)[1]
#         # return result


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值