std::vector
使用std::vector<pair<int, int>>
作为默认容器(参考this)。为了根据k
中的第一个元素进行排序,我们需要定义自己的比较函数(参考this)。这就是我的理解。
现在,以下代码在O(NlogK)中返回非空数组中最常见的class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
if(nums.empty())
return vector<int>();
unordered_map< int, int > hashMap;
for(int i=0; i<nums.size(); i++)
hashMap[nums[i]]++;
priority_queue< pair< int, int >> pq;
vector< int > result;
unordered_map< int, int >::iterator it=hashMap.begin();
for(it=hashMap.begin(); it!=hashMap.end(); it++) {
//the first one is frequency and the second one is the value
pq.push(make_pair(it->second, it->first));
//the peculiar implementation below is because we the code to be O(NlogK)
if(pq.size()>(hashMap.size()-k)) {
result.push_back(pq.top().second);
pq.pop();
}
}
return result;
}
};
元素:
std::priority_queue
此代码正常运行并被法官接受 - 但如何?使用std::vector<pair<int, int>>
作为其基础容器的{{1}}必须包含自定义比较函数,以便正确排序。那么,它是如何运作的?
答案 0 :(得分:1)
坦率地说,它之所以有效,是因为它的设计目的。
一些事情:
std::priority_queue
使用std::less<T>
,其中T
是基础序列值类型,作为未指定覆盖时的默认比较器。std::less<T>
针对两个operator <
参数调用T
,解析为最适合和/或可用的任何参数。因此,如果这可以按照您的意愿工作而没有特殊的序列类型比较器覆盖,那么它必须意味着operator <
存在std::pair<int,int>
,将整个事物连接在一起。
确实有。检查std::pair<T1,T2>
的文档,您会发现operator <
重载有效地执行此操作:
if (lhs.first < rhs.first)
return true;
else if (!(rhs.first < lhs.first))
return lhs.second < rhs.second
else
return false;
有关其如何运作的精神播放示例留待读者思考。