问题
思路
Map怎么对value进行排序。
参考了这篇链接[C++ STL中Map的按Key排序和按Value排序]
代码
typedef pair<int, int> Pair;
bool cmp_by_value(Pair& lhs, Pair& rhs){
return rhs.second < lhs.second;
}
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> ret;
map<int, int> mapper;
int sz = nums.size();
if(k > sz) return ret;
for(int i = 0; i < sz; ++i){
++mapper[nums[i]];
}
vector<Pair> vec( mapper.begin(), mapper.end() );
sort( vec.begin(), vec.end(), cmp_by_value );
for(int i = 0; i < k; ++i){
ret.push_back(vec[i].first);
}
return ret;
}
};
思路1
这个题,要是不用函数对象,要写在类里面还真不行。
代码1
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int, int> counter;
int sz = nums.size();
vector<int> ret;
if(!sz || k < 1) return ret;
for(int i = 0; i < sz; ++i){
++counter[ nums[i] ];
}
// sort the mapper
typedef pair<int, int> pair_t;
vector<pair_t> vec( counter.begin(), counter.end() );
struct CmpByValue{
bool operator()(pair_t& lhs, pair_t& rhs) {return lhs.second > rhs.second; }
};
sort( vec.begin(), vec.end(), CmpByValue() );
for(int i = 0; i < k; ++i ){
ret.push_back( vec[i].first );
}
return ret;
}
private:
};
当然,函数对象有一个内联的特点,据说是要比函数调用效率高。