TopK问题,就是找到一堆数据中最大/最小、出现频率最高等问题。现在想一下其实解决TopK问题的话,有一下几个想法:
1、直接各种排序,前提是内存足够的话,如果数据量极大,那就不太抗得住了。
2、最大最小堆。保留K个值,然后其他值与之比较,对最大/最小堆进行增加删除操作。
3、分治思想。把所有数据分成无数的k段,然后再合并不同的段称为新的k段,直到最后剩下一个段,即为所求。
4、hash法
下面就用实例来上手一下:
Leetcode347. 前 K 个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
class Solution {
public:
//此时要定义为静态函数,否则在类中无法直接调用
static bool cmp(pair<int,int> m1,pair<int,int> m2)
{
return m1.second>m2.second;
}
vector<int> topKFrequent(vector<int>& nums, int k) {
//用map来统计每个元素的个数
map<int,int> m;
for(int i=0;i<nums.size();i++)
{
m[nums[i]]++;
}
//将每个map放入vector中(用迭代器),便于后续的按数量多少进行排序
vector<pair<int,int>> v;
map<int,int>::iterator it;
for(it=m.

最低0.47元/天 解锁文章
979

被折叠的 条评论
为什么被折叠?



