当前位置: 首页 > 后端技术 > Python

LeetCode347-TopKFrequentElements

时间:2023-03-25 22:38:44 Python

题目:给定一个非空整数数组,返回出现频率最高的前K个元素。给定一个非空整数数组,返回K个出现频率最高的元素。示例1:输入:nums=[1,1,1,2,2,3],k=2输出:[1,2]示例2:输入:nums=[1],k=1输出:[1]解释:你可以假设给定的k总是合理的,并且1≤k≤数组中不同元素的数量。您的算法的时间复杂度必须优于O(nlogn),其中n是数组的大小。注意:您可以假设k始终有效,1≤k≤唯一元素的数量。您的算法的时间复杂度必须优于O(nlogn),其中n是数组的大小。解题思路:本题大致解题步骤为:频次统计-->按频次排序-->返回频次最高的前K个元素注:该题要求时间复杂度优于O(n日志n)。Hashmap,key是元素,value是频率。它的时间复杂度是O(n)。重点是返回出现频率最高的前K个元素,所以另一种更简单的方法是直接使用堆(优先队列)这种数据结构维护一个大小为K的堆来动态存储出现频率最高的前K个元素,时间复杂度为O(n);//(intn:nums)的频率统计count.put(n,count.getOrDefault(n,0)+1);//要创建优先级队列,请使用Lambda表达式PriorityQueueheap=newPriorityQueue((a,b)->count.get(a)-count.get(b));//你也可以使用compare比较函数//PriorityQueueheap=newPriorityQueue<>(newComparator(){//@Override//publicintcompare(Integera,Integerb){//返回map.get(a)-map.get(b);//}//});//维护一个大小为k的排序数组Priorityqueuefor(intn:count.keySet()){heap.add(n);如果(heap.size()>k)heap.poll();}//返回结果Listtop_k=newLinkedList();while(!heap.isEmpty())top_k.add(heap.poll());返回top_k;}}Python:Python基础库中的heapq堆数据结构有两个函数:nlargestnsmallest如heapq.nsmallest(n,nums)表示取迭代器nums的前n个最大的元素。这个函数也可以接受一个key关键字来处理复杂的数据结构。结合collections.Counter()频率统计功能,两行代码即可解决classSolution:deftopKFrequent(self,nums,k):""":typenums:List[int]:typek:int:rtype:List[int]"""count=collections.Counter(nums)returnheapq.nlargest(k,count.keys(),key=count.get)注意关键字参数的作用:key=count.get