返回介绍

solution / 0600-0699 / 0692.Top K Frequent Words / README

发布于 2024-06-17 01:03:35 字数 3415 浏览 0 评论 0 收藏 0

692. 前 K 个高频单词

English Version

题目描述

给定一个单词列表 words 和一个整数 k ,返回前 k_ _个出现次数最多的单词。

返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。

 

示例 1:

输入: words = ["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 <= words.length <= 500
  • 1 <= words[i] <= 10
  • words[i] 由小写英文字母组成。
  • k 的取值范围是 [1, 不同 words[i] 的数量]

 

进阶:尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。

解法

方法一:哈希表 + 排序

class Solution:
  def topKFrequent(self, words: List[str], k: int) -> List[str]:
    cnt = Counter(words)
    return sorted(cnt, key=lambda x: (-cnt[x], x))[:k]
class Solution {
  public List<String> topKFrequent(String[] words, int k) {
    Map<String, Integer> cnt = new HashMap<>();
    for (String v : words) {
      cnt.put(v, cnt.getOrDefault(v, 0) + 1);
    }
    PriorityQueue<String> q = new PriorityQueue<>((a, b) -> {
      int d = cnt.get(a) - cnt.get(b);
      return d == 0 ? b.compareTo(a) : d;
    });
    for (String v : cnt.keySet()) {
      q.offer(v);
      if (q.size() > k) {
        q.poll();
      }
    }
    LinkedList<String> ans = new LinkedList<>();
    while (!q.isEmpty()) {
      ans.addFirst(q.poll());
    }
    return ans;
  }
}
class Solution {
public:
  vector<string> topKFrequent(vector<string>& words, int k) {
    unordered_map<string, int> cnt;
    for (auto& v : words) ++cnt[v];
    vector<string> ans;
    for (auto& [key, _] : cnt) ans.emplace_back(key);
    sort(ans.begin(), ans.end(), [&](const string& a, const string& b) -> bool {
      return cnt[a] == cnt[b] ? a < b : cnt[a] > cnt[b];
    });
    ans.erase(ans.begin() + k, ans.end());
    return ans;
  }
};
func topKFrequent(words []string, k int) []string {
  cnt := map[string]int{}
  for _, v := range words {
    cnt[v]++
  }
  ans := []string{}
  for v := range cnt {
    ans = append(ans, v)
  }
  sort.Slice(ans, func(i, j int) bool {
    a, b := ans[i], ans[j]
    return cnt[a] > cnt[b] || cnt[a] == cnt[b] && a < b
  })
  return ans[:k]
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文