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.
====================================================================================
题目链接:https://leetcode.com/problems/top-k-frequent-elements/
题目大意:求出给定数组中出现最多的k个元素,要求使用时间复杂度为O(n log n)的算法。
思路:先建立一个map映射表,将元素映射到个数,然后存入vector中,通过自定义排序函数(先按出现个数从大到小排序,在按元素从小到大排序),对vector进行排序,则vector中前面k个元素就是我们要求的结果。
附上代码:
题目链接:https://leetcode.com/problems/top-k-frequent-elements/
题目大意:求出给定数组中出现最多的k个元素,要求使用时间复杂度为O(n log n)的算法。
思路:先建立一个map映射表,将元素映射到个数,然后存入vector中,通过自定义排序函数(先按出现个数从大到小排序,在按元素从小到大排序),对vector进行排序,则vector中前面k个元素就是我们要求的结果。
附上代码:
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map <int,int> maper ;
int n = nums.size() ;
for ( int i = 0 ; i < n ; i ++ )//构建map表,元素映射到个数
maper[nums[i]] ++ ;
vector < pair <int,int> > v ;
for ( map <int,int>::iterator it = maper.begin() ; it != maper.end() ; it ++ )//存入vector中
{
v.push_back ( make_pair ( it -> first , it -> second ) ) ;
}
sort ( v.begin() , v.end() , cmp ) ;//先按出现个数从大到小排序,在按元素从小到大排序
vector <int> ans ;
for ( int i = 0 ; i < k ; i ++ )//取前k个
{
ans.push_back ( v[i].first ) ;
}
return ans ;
}
private:
static bool cmp ( const pair<int,int>& a , const pair<int,int>& b )//先按出现个数从大到小排序,在按元素从小到大排序
{
if ( a.second == b.second )
return a.first < b.first ;
return a.second > b.second ;
}
};