Top K Frequent Words
Given a list of words and an integer k, return the top k frequent words in the list.
Example
Given
不看follow up的话很简单,直接把所有的<word,count>pair放到vector中再排序就好了,或者放到一个最大堆里面,以count为key[ "yes", "lint", "code", "yes", "code", "baby", "you", "baby", "chrome", "safari", "lint", "code", "body", "lint", "code"
]
代码如下:
struct cmp{
bool operator() (pair<string, int> a, pair<string, int> b) const {
if (a.second < b.second)
return true;
else if (a.second == b.second) {
return a.first > b.first;
}
return false;
}
};
class Solution {
public:
/**
* @param words an array of string
* @param k an integer
* @return an array of string
*/
vector<string> topKFrequentWords(vector<string>& words, int k) {
priority_queue<pair<string, int>, vector<pair<string, int>>, cmp> que;
unordered_map<string, int> map;
for (auto i : words) {
map[i]++;
}
for (auto &i : map) {
que.push(make_pair(i.first, i.second));
}
vector<string> result;
for (int i = 1; i <= k; i++) {
result.push_back(que.top().first);
que.pop();
}
return result;
}
};
follow up:
what if input is sorted stream? (113447777)
我想了半天,如果是在stream里面,那就不能和之前的方法一样直接把所有的pair读完了放到vector或者堆中。所以这里我们要保留上一个输入的数字,直到当前输入与上一次的输入不同时(说明上一个数字已经走完),再把上一个数字形成<word,count>pair,存入堆中。
例如 1.当输入113,该输入4的时候,把<3,1>放入堆。
2. 当113447,当前为7时,记录当前数字为7,出现次数为2,当要取出当前第k个frequent的元素时,要同时比较堆中元素和当前元素。
关键是要用上stream是sorted,所以一旦一个数字都输入完了才可以生成pair入堆。