class Solution {
typedef pair<int, int> PAIR;
public:
struct CmpByValue {
bool operator()(const PAIR& lhs, const PAIR& rhs) {
return lhs.second < rhs.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int, int> cnt;
for (int i = 0; i < nums.size(); i++)
{
cnt[nums[i]]--;
}
vector<PAIR> cnt_vec(cnt.begin(), cnt.end());
sort(cnt_vec.begin(), cnt_vec.end(), CmpByValue());
vector<int> ans;
for (int i = 0; i < k; i++)
{
ans.push_back(cnt_vec[i].first);
//printf("%d\n", cnt_vec[i].second);
}
return ans;
}
};
第一眼看到这题的时候以为很简单,O(nlogn)嘛,就直接sort就行。
想的是建一个struct数组存它的值和出现次数,直接排序。但是它没给数据范围就不能用数组,我就想到了map,自带排序【!!刚刚突然想到可以直接用vector里面存struct…估计比我这样写还简单…】
用iterator遍历就行,注意c++好像默认的排序都是从小到大(内部定义了<),如果需要从大到小可以把数变成负数,也可以用rbegin()
但是map<key, value>,它有序是对于key有序,也就是map['Ahhhh'] = 100
这里的Ahhhh,相当于你把电话簿用map存起来,它是给你按照姓名排好序的,便于索引。
但是我们这里需要排序的是出现次数,是value,就把它转存到vector里,再sort,但是这里还是需要写一个比较函数
…啊我啥都不会,改天来好好编辑这篇,我现在脑子里全是问号TVT