leetcode692. 前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. 假定 k 总为有效值, 1 ≤ k ≤ 集合元素数。
  2. 输入的单词均由小写字母组成。

 

扩展练习:

  1. 尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。

通过次数15,640提交次数30,404

typedef pair P; //频数,单词
struct Order{
    //起到greater作用,如果a的优先级大于b,则返回true
    bool operator()(const P& a, const P& b) const{
        //a,b 频数大的,优先级大, 频数相等,字典序小的优先级大
        return (a.first>b.first ||(a.first==b.first&& a.second topKFrequent(vector& words, int k) {
        vector ans;
        int n =  words.size();
        Order ord;//比较器
        //用于统计词频
        unordered_map word_freq;
        for(string x: words) word_freq[x]++;
        //遍历,构造一个大小为k的小堆顶
        priority_queue,Order> pq;
        for(auto item: word_freq){
            P tmp{item.second,item.first};//当前元素
            //如果没满继续加
            if(pq.size()

python

 

class Word:
    def __init__(self,freq,word):
        self.freq = freq
        self.word = word
    def __lt__(self,other):
        if self.freq == other.freq:
            return self.word>other.word
        return self.freq List[str]:
        heap =[]
        fre_dict = Counter(words)
        for key, freq in fre_dict.items():
            heapq.heappush(heap,Word(freq,key))
            if len(heap)>k:
                heapq.heappop(heap)
        
        res =[]
        for i in range(k):
            res.append(heapq.heappop(heap).word)
        return reversed(res)

 

你可能感兴趣的:(算法,python,c++)