K frequent words (in/not in stream) | lintcode

Top K Frequent Words

Given a list of words and an integer k, return the top k frequent words in the list.

Example

Given

[
    "yes", "lint", "code",
    "yes", "code", "baby",
    "you", "baby", "chrome",
    "safari", "lint", "code",
    "body", "lint", "code"
]
 不看follow up的话很简单,直接把所有的<word,count>pair放到vector中再排序就好了,或者放到一个最大堆里面,以count为key

代码如下:

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入堆。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值