前K个高频单词--力扣
Posted 穿迷彩服的鲨鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前K个高频单词--力扣相关的知识,希望对你有一定的参考价值。
前言
此题是 347.前K个高频元素的类似题目,多加了一个“如果不同的单词有相同出现频率,按字母顺序排序”
给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。
如果不同的单词有相同出现频率,按字母顺序排序。
一、示例
示例 1:
输入: [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2
输出: [“i”, “love”]
解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 “i” 在 “love” 之前。
示例 2:
输入: [“the”, “day”, “is”, “sunny”, “the”, “the”, “the”, “sunny”, “is”, “is”], k = 4
输出: [“the”, “is”, “sunny”, “day”]
解析: “the”, “is”, “sunny” 和 “day” 是出现次数最多的四个单词,
出现次数依次为 4, 3, 2 和 1 次。
二、代码解析
1.哈希表排序
代码如下(示例):
/*
* 如何给unordered_map 按照value进行排序
* 需要重写sort中的排序
* unordered_map不能直接排序,需要使用pair存在vector中
*/
static bool comp(pair<string, int>& m, pair<string, int>& n)
{
if (m.second==n.second)//如果出现的频率相等,按字母大小排序
{
return m.first < n.first;
}
else
{
return m.second > n.second;
}
}
vector<string> topKFrequent(vector<string>& words, int k)
{
vector<string> newWords(k, "");
unordered_map<string, int> map;
for (auto& word : words)
{
++map[word];
}
vector<pair<string, int> > b;
for (auto x : map)
{
b.push_back(x);
}
sort(b.begin(), b.end(), comp);
int index = 0;
for (auto i : b)
{
newWords[index] = i.first;
index++;
if (index == k)
{
break;
}
}
return newWords;
}
结果
2.优先队列
代码如下(示例):
vector<string> topKFrequent(vector<string>& words, int k)
{
unordered_map<string, int> map;
for (auto& word : words)
{
++map[word];
}
auto cmp = [](const pair<string, int>& a, const pair<string, int>& b)
{
return a.second == b.second ? a.first < b.first : a.second > b.second;//如果出现的频率相等,按字母大小排序
};
priority_queue<pair<string, int>, vector<pair<string, int>>, decltype(cmp)> que(cmp);
for (auto& it : map)//剩余前K个高频单词
{
que.emplace(it);
if (que.size() > k)
{
que.pop();
}
}
vector<string> ret(k);
for (int i = k - 1; i >= 0; i--)
{
ret[i] = que.top().first;
que.pop();
}
return ret;
}
结果
3.测试
代码如下(示例):
#include<vector>
#include<unordered_map>
#include <iostream>
#include<algorithm>
#include <queue>
using namespace std;
/*
* 如何给unordered_map 按照value进行排序
* 需要重写sort中的排序
* unordered_map不能直接排序,需要使用pair存在vector中
*/
/*
static bool comp(pair<string, int>& m, pair<string, int>& n)
{
if (m.second == n.second)//如果出现的频率相等,按字母大小排序
{
return m.first < n.first;
}
else
{
return m.second > n.second;
}
}
vector<string> topKFrequent(vector<string>& words, int k)
{
vector<string> newWords(k, "");
unordered_map<string, int> map;
for (auto& word : words)
{
++map[word];
}
vector<pair<string, int> > b;
for (auto x : map)
{
b.push_back(x);
}
sort(b.begin(), b.end(), comp);
int index = 0;
for (auto i : b)
{
newWords[index] = i.first;
index++;
if (index == k)
{
break;
}
}
return newWords;
}*/
vector<string> topKFrequent(vector<string>& words, int k)
{
unordered_map<string, int> map;
for (auto& word : words)
{
++map[word];
}
auto cmp = [](const pair<string, int>& a, const pair<string, int>& b)
{
return a.second == b.second ? a.first < b.first : a.second > b.second;//如果出现的频率相等,按字母大小排序
};
priority_queue<pair<string, int>, vector<pair<string, int>>, decltype(cmp)> que(cmp);
for (auto& it : map)//剩余前K个高频单词
{
que.emplace(it);
if (que.size() > k)
{
que.pop();
}
}
vector<string> ret(k);
for (int i = k - 1; i >= 0; i--)
{
ret[i] = que.top().first;
que.pop();
}
return ret;
}
int main()
{
vector<string> words = { "the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is" };
vector<string> k = topKFrequent(words, 4);
for (int i = 0; i < k.size(); i++)
{
cout << k[i] << " ";
}
return 0;
}
结果
总结
以上是关于前K个高频单词--力扣的主要内容,如果未能解决你的问题,请参考以下文章