当前位置: 首页 > news >正文

【Leetcode 347】,前k个高频元素,小根堆的调整

参考题解

题目:给定一个数组,输出 前k个高频元素。
思路:
遍历数组,建立小根堆(小根堆的元素是元组(num,freq),排序规则是每个元素的频率)。
下面使用数组‘heap’,函数’shift_down’,函数‘shift_up’等实现小根堆及其调整(上浮、下沉)。

 def topKFrequent(self, nums: List[int], k: int) -> List[int]:def shift_down(arr,root,k):# 下沉的原因是,新换了堆顶,我们需要为这个堆顶元素找到它在堆中的正确位置# k表示目前堆的有效大小val=arr[root] # root node : <num,freq>while root<<1 <k:child=root<<1if child|1<k and arr[child|1][1]<arr[child][1]:child|=1if arr[child][1]<val[1]:arr[root]=arr[child]root=childelse:breakarr[root]=valdef shift_up(arr,child):# 上浮调整操作,# 上浮原因是,我们在堆的末尾添加了新元素,我们需要为这个新元素找到它在堆中的正确位置val=arr[child]while child>>1 >0 and arr[child>>1][1]>val[1]:arr[child]=arr[child>>1]child>>=1arr[child]=valstat=collections.Counter(nums)# 清点数组nums中的元素个数stat=list(stat.items())heap=[(0,0)] # 用(0,0)做垫底,为了实现在数组中方便找到父子节点之间的联系,如果父节点的索引是root,那么左孩子的索引是root<<1,右孩子的索引是(root<<1)|1。相反地,如果孩子的索引是child,那么父的索引是child>>1for i in range(k):heap.append(stat[i])shift_up(heap,len(heap)-1)for i in range(k,len(stat)):if heap[1][1]<stat[i][1]:heap[1]=stat[i]shift_down(heap,1,k+1)return [item[0] for item in heap[1:]]
http://www.lryc.cn/news/332963.html

相关文章:

  • 【图论】【分类讨论】LeetCode3017按距离统计房屋对数目
  • 浅谈Yum 安装和 源码安装
  • JavaEE初阶Day 3:多线程(1)
  • gutil140.dll是什么?gutil140.dll无法继续执行的解决方法
  • 在CentOS 7上安装Python 3.7.7
  • 基于SpringBoot Vue宠物领养系统
  • ip命令
  • 【Kaggle】练习赛《鲍鱼年龄预测》(上)
  • Ruby 之交租阶段信息生成
  • RUST语言值所有权之内存复制与移动
  • 【Django学习笔记(三)】BootStrap介绍
  • ClickHouse开发相关(UDAF)
  • MySql并发事务问题
  • Windows下Docker创建Mysql5.7
  • Redis(性能管理、主从复制、哨兵模式)概述及部署
  • LabVIEW挖坑指南
  • docker容器环境安装记录(MAC M1)(完善中)
  • Linux 常用命令(持续更新中...)
  • xss.pwnfunction-Jefff
  • java——文件上传
  • RCE(远程命令执行)漏洞详解
  • K8S - Deployment 的版本回滚
  • 53 v-bind 和 v-model 的实现和区别
  • VMware-16.0配置虚拟机网络模式
  • element-ui badge 组件源码分享
  • MySQL中日期有关函数
  • jdbc工具类
  • Svelte Web 框架介绍
  • IP地址获取不到的原因是什么?
  • Android APP加固利器:深入了解混淆算法与混淆配置