天天看點

Leetcode 692. Top K Frequent Words 前K個高頻單詞(最小堆)

Leetcode 692. Top K Frequent Words 前K個高頻單詞:最小堆

    • 692. Top K Frequent Words 前K個高頻單詞
      • 題目描述
      • 示例:
      • 解答
      • 代碼

692. Top K Frequent Words 前K個高頻單詞

題目描述

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.

Note:

You may assume k is always valid, 1 ≤ k ≤ number of unique elements.

Input words contain only lowercase letters.

Follow up:

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

示例:

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.
           

解答

這道題先掃描一遍數組,記錄一下每個單詞出現的頻率。

然後建立一個最小堆,裡面隻能存放k個單詞,最後将這k個單詞安從大到小排列就是前K個高頻單詞。

代碼

class Solution {
public:
 struct comp {
  bool operator()(const pair<string, int> &lhs, const pair<string, int> & rhs) const {
   if (lhs.second == rhs.second) {
    return lhs.first < rhs.first;
   }
   return lhs.second > rhs.second;
  }
 };
    vector<string> topKFrequent(vector<string>& words, int k) {
        unordered_map <string, int> ump;
        for (auto & w : words) {
         ump[w] += 1;
        }

        priority_queue<pair<string, int>, vector<pair<string, int>>, comp> pq;
        for (auto & u : ump) {
         pq.emplace(u.first, u.second);
         if (pq.size() > k) pq.pop();
        }
        vector<string> ans;
        while(!pq.empty()) {
         ans.insert(ans.begin(), pq.top().first);
         pq.pop();
        }
        return ans;
    }

};