温州网站制作系统,0453牡丹江信息网手机版,怎么做室内设计公司网站,中国网络平台排名前十思路#xff1a;记录元素出现的次数用map#xff1b; 要维护前k个元素#xff0c;不至于把所有元素都排序再取前k个#xff0c;而是新建一个堆#xff0c;用小根堆存放前k个最大的数。 为什么是小根堆#xff1f;因为堆每次出数据时只出堆顶#xff0c;每次把当前最小的… 思路记录元素出现的次数用map 要维护前k个元素不至于把所有元素都排序再取前k个而是新建一个堆用小根堆存放前k个最大的数。 为什么是小根堆因为堆每次出数据时只出堆顶每次把当前最小的堆顶排出去 把更大的换进来到最后只会剩下几个最大的元素。 堆的排序复杂度是 log(K)所以整体是 n*long(K);
class Solution {public int[] topKFrequent(int[] nums, int k) {MapInteger,Integer map new HashMap();//元素和次数 放入mapfor(int i : nums){map.put(i, map.getOrDefault(i,0)1);}//int[] 里面只放2两个值k-v用来代替map的元素PriorityQueueint[] xiaoDui new PriorityQueue((nums1,nums2)-nums1[1]-nums2[1]);//小根堆//遍历map里的元素维护一个K个元素的小根堆里面放的是大数for(Map.EntryInteger,Integer item : map.entrySet()) {if(xiaoDui.size()k){xiaoDui.add(new int[] {item.getKey(),item.getValue()});}else{//堆顶元素小时出堆顶入新元素if(xiaoDui.peek()[1]item.getValue()) {xiaoDui.poll();xiaoDui.add(new int[] {item.getKey(),item.getValue()});}}}//把key取出来返回int[] ans new int[k];for(int i0;ik;i){ans[i] xiaoDui.poll()[0];}return ans;}
}