C++实现数组中出现最频繁的前top k个元素
来源:互联网 发布:中科信证券软件 编辑:程序博客网 时间:2024/06/05 00:59
要求: 时间复杂度小于等于 nlogn.
算法解题思路:
1, 由于原始数组是杂乱无序的, 所以 统计数组中元素出现的次数时间复杂度达到了n^2, 不符合题意.
2, 在统计数组中的元素出现次数之前, 先对数组进行排序, 用时间复杂度是 nlogn的排序算法进行排序, 在这里用C++ 中函数库STL中的sort直接排序, 关于STL中sort实现(成熟的快速排序算法, 结合了内插排序,具体读读STL中实现).
3. 从排好序的第一个元素开始扫描, 统计每个元素出现的次数,时间复杂度为n.
4. 由3给出的每个元素的统计情况, 与2类似的方法进行从大到小排序, 取出前K个对应元素即可,时间复杂度nlogn.
附源代码:
#include<vector>#include<algorithm>#include<cstdlib>#include<iostream>using namespace std;/*this practice C++ knowledge:vector : useage, memory management, iteratoralgorithm:sort(), user identify functioncstdlib: creating random number*/struct key_value{ int key; int num;};bool compare(const key_value& k1, const key_value& k2) { return k1.num>k2.num;}class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { int j=0; int number=1; int num=nums.size(); vector<key_value> topk; vector<int>* key=new vector<int>(0);//very important sort(nums.begin(),nums.end());//原始数组排序 for(int i=1;i<num;i++){ if(nums[i]==nums[j]){ number++; } else{ key_value kv; kv.key=nums[j]; kv.num=number; topk.push_back(kv); number=1; j=i; } }//统计元素的频数 key_value kv; kv.key=nums[j]; kv.num=number; topk.push_back(kv);//统计最后一个元素 sort(topk.begin(),topk.end(), compare); j=1; for(vector<key_value>::iterator it=topk.begin();it!=topk.end()&&(j<=k);it++){ key->push_back((*it).key); j++; }//前K个元素取出来 return (*key); }};int main(){ Solution sl; vector<int>::iterator it; vector<int> v; for(int i=0;i<10;i++) v.push_back(rand()%10+1); vector<int> topk=sl.topKFrequent(v,2);//取出数组中出现次数最频繁的前K个元素.,这里是2 for(it=topk.begin();it!=topk.end();it++) cout<<(*it)<<" , "; cout<<endl; return 0;}
0 0
- C++实现数组中出现最频繁的前top k个元素
- 前K个最频繁的元素
- 347. Top K Frequent Elements(找出数组中出现次数最多的前k个元素)
- LeetCode 347. Top K Frequent Elements(最频繁的K个元素)
- Top K Frequent Elements 选出数组中出现次数最多的k个元素
- leetcode_347. Top K Frequent Elements 找出现频率最高的前k个元素
- n个元素的数组中找出前K个最大数最有效算法O(nlg(k))
- 网易_在数组中查找前K个元素
- Java如何找出数组中前k个高频元素
- Java如何找出数组中前k个高频元素
- Top K 算法(从n多个数据中查找出现频率最多的前m个的问题)
- 求一个数组中出现次数前k种的元素
- 东软一道递归题实现数组前K个元素的最大值
- 查找数组中前K个大的和小的元素
- 典型的Top K算法_找出一个数组里面前K个最大数
- 数组中最出现一次的元素
- Top K Frequent Elements:查找频率前K的元素
- 典型的Top K算法_找出一个数组里面前K个最大数...或找出1亿个浮点数中最大的10000个...一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,
- 注解
- 正则去掉html中间的php代码
- 点到平面的距离公式
- 母函数
- Android 软键盘自动弹出和关闭
- C++实现数组中出现最频繁的前top k个元素
- 从服务器端获取的图片放在客户端的控件上如何等比例裁切且不失真
- linux下单机版zookeeper安装
- 一个用于大规模数据科学的API——DataFrame
- HDU 百度之星(测试赛)1003 - IP聚合
- 引用传递——值传递
- Android高效加载大图、多图解决方案,有效避免程序OOM
- 史上最详细的Android Studio系列教程一--下载和安装
- UITableView的两种重用Cell方法的区别