要求: 时间复杂度小于等于 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, iterator
algorithm:sort(), user identify function
cstdlib: 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 num