博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode347. Top K Frequent Elements
阅读量:6906 次
发布时间:2019-06-27

本文共 1425 字,大约阅读时间需要 4 分钟。

题目要求

Given a non-empty array of integers, return the k most frequent elements.For example,Given [1,1,1,2,2,3] and k = 2, return [1,2].Note: You may assume k is always valid, 1 ≤ k ≤ number of unique elements.Your algorithm's time complexity must be better than O(n log n), where n is the array's size.

假设有一个非空的整数数组,从中获得前k个出现频率最多的数字。

思路和代码

这里有一个额外要求即时间复杂度要优于O(n log n),也就是说我们无法采用先排序再顺序计算的方式来进行统计,因为最好的排序算法其平均的时间复杂度也需要O(n log n)。那么有没有别的方法可以让我们达到更好的效率呢?

这里的核心思路是桶排序,我们通过使用n+1个桶(其中第i个桶代表出现i次的数据)来汇拢每个数字出现的次数。先用HashMap来统计出现次数,然后将其丢到对应的桶中,最后从最高的桶开始向低的桶逐个遍历,取出前k个频率的数字。

public List
topKFrequent(int[] nums, int k) { List
[] buckets = new List[nums.length + 1]; Map
frequency = new HashMap
(); for(int num : nums){ frequency.put(num, frequency.getOrDefault(num, 0) + 1); } for(int key : frequency.keySet()){ int frequencyOfKey = frequency.get(key); if(buckets[frequencyOfKey] == null){ buckets[frequencyOfKey] = new ArrayList
(); } buckets[frequencyOfKey].add(key); } List
result = new ArrayList
(); for(int i = buckets.length-1 ; i>=0 && k>result.size() ; i--){ if(buckets[i] != null){ result.addAll(buckets[i]); } } return result; }

clipboard.png

想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

转载地址:http://eumdl.baihongyu.com/

你可能感兴趣的文章
《HTML5实战》——1.5 小结
查看>>
Linux管理常见错误的解决方法
查看>>
MySQL架构优化实战系列3:定时计划任务与表分区
查看>>
kafka - advertised.listeners and listeners
查看>>
Hadoop YARN学习监控JVM和实时监控Ganglia、Ambari(5)
查看>>
ECharts:免费,开源,超炫的可视化作品
查看>>
跨界 +赋能——互联网的下一个关键词
查看>>
活动干货|基于Docker的DevOps实现
查看>>
C语言OJ项目参考(1030)求奖金总数
查看>>
15、Python与设计模式--中介者模式
查看>>
杂七杂八的一起来
查看>>
C语言OJ项目参考(1942)进制转换
查看>>
Go 语言读写 Excel
查看>>
[LeetCode]--34. Search for a Range
查看>>
Single
查看>>
[LeetCode]--62. Unique Paths
查看>>
Java编程思想学习笔记——初始化与清理
查看>>
【原创】.NET平台机器学习组件-Infer.NET连载(二)贝叶斯分类器
查看>>
线程管理(七)守护线程的创建和运行
查看>>
关于javascript字符串连接性能
查看>>