您的位置:首页 > 其它

leetcode笔记—map容器的使用

2016-05-19 20:49 218 查看
Given 
[1,1,1,2,2,3]
 and
k = 2, return 
[1,2]
.

用一个map容器记下每个元素出现的次数,再用优先级队列按从大到小存下Map的元素

class Solution {
typedef pair<int, int> data;
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int,int> mapint;
priority_queue<data, vector<data>, greater<data>> heap;
vector<int> re;
vector<int> res;
for(int i=0;i<nums.size();i++) // 统计每个元素的个数
{
if(mapint.find(nums[i])==mapint.end())
mapint[nums[i]]=1;
else mapint[nums[i]]++;
}
for(auto it:mapint) {
heap.push(make_pair(it.second, it.first));
if(heap.size() > k) heap.pop();
}
while(!heap.empty())
{
re.push_back(heap.top().second);
heap.pop();
}
for(int i=re.size()-1;i>=0;i--)
{
res.push_back(re[i]);
}
return res;
}

};

网上较优的代码
class Solution {
typedef pair<int, int> data;
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> hash;
priority_queue<data, vector<data>, greater<data>> heap;
vector<int> ret;

for(int num:nums)
​ ​ ​hash[num]++;

for(auto it:hash) {
heap.push(make_pair(it.second, it.first));
if(heap.size() > k) heap.pop();
}

while(!heap.empty()) {
ret.push_back(heap.top().second);
heap.pop();
}

return ret;
}
};


用排列桶
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> hash;
vector<vector<int>> buckets(nums.size()+1);
vector<int> ret;

for(int num:nums)
​ ​ ​hash[num]++;

for(auto it:hash)
​ ​ ​buckets[it.second].push_back(it.first);

for(int i=buckets.size()-1; i>0; --i) {
for(auto num:buckets[i]) {
ret.push_back(num);
if(ret.size() == k) return ret;
}
}

return ret;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: