692. Top K Frequent Words(Map+桶排序)

Given a non-empty list of words, return the k most frequent elements.

Your answer should be sorted by frequency from highest to lowest. If two words have the same frequency, then the word with the lower alphabetical order comes first.

Example 1:

Input: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
Output: ["i", "love"]
Explanation: "i" and "love" are the two most frequent words.
    Note that "i" comes before "love" due to a lower alphabetical order.

Example 2:

Input: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
Output: ["the", "is", "sunny", "day"]
Explanation: "the", "is", "sunny" and "day" are the four most frequent words,
    with the number of occurrence being 4, 3, 2 and 1 respectively.

Note:

  1. You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
  2. Input words contain only lowercase letters.

Follow up:

  1. Try to solve it in O(n log k) time and O(n) extra space.

思路:先將所有單詞放入map中(已根據字母表遞增排好序),統計出現的次數,開啓n個桶,第i個桶存放出現次數爲i的單詞,然後從最後一個桶開始拿出其中的單詞插入結果數組的尾部。

 

class Solution {
public:
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string,int> cnt;
        for(auto& i:words) cnt[i]++; //&
        vector<vector<string> >bucket(words.size());
        for(auto i:cnt) bucket[i.second].push_back(i.first);
        vector<string> res;
        for(int i=(int)words.size()-1;i>=0;i--){
            int n = min(k,(int)bucket[i].size());
            res.insert(res.end(),bucket[i].begin(),bucket[i].begin()+n);
            k -= n;
        }
        return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章