From b36f0c69b484efe7103569ffc9d52e5fb0adca5f Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Thu, 20 May 2021 09:58:51 +0800 Subject: [PATCH] =?UTF-8?q?692:=E5=89=8DK=E4=B8=AA=E9=AB=98=E9=A2=91?= =?UTF-8?q?=E5=8D=95=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leetcode/editor/cn/TopKFrequentWords.java | 83 +++++++++++++++++++ .../leetcode/editor/cn/TopKFrequentWords.md | 41 +++++++++ 2 files changed, 124 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/TopKFrequentWords.java create mode 100644 src/main/java/leetcode/editor/cn/TopKFrequentWords.md diff --git a/src/main/java/leetcode/editor/cn/TopKFrequentWords.java b/src/main/java/leetcode/editor/cn/TopKFrequentWords.java new file mode 100644 index 0000000..1c0f2ef --- /dev/null +++ b/src/main/java/leetcode/editor/cn/TopKFrequentWords.java @@ -0,0 +1,83 @@ +//给一非空的单词列表,返回前 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 次。 +// +// +// +// +// 注意: +// +// +// 假定 k 总为有效值, 1 ≤ k ≤ 集合元素数。 +// 输入的单词均由小写字母组成。 +// +// +// +// +// 扩展练习: +// +// +// 尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。 +// +// Related Topics 堆 字典树 哈希表 +// 👍 265 👎 0 + +package leetcode.editor.cn; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.PriorityQueue; + +//692:前K个高频单词 +public class TopKFrequentWords{ + public static void main(String[] args) { + //测试代码 + Solution solution = new TopKFrequentWords().new Solution(); + } + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) +class Solution { + public List topKFrequent(String[] words, int k) { + HashMap map = new HashMap<>(); + for (String s : words) { + map.put(s, map.getOrDefault(s, 0) + 1); + } + PriorityQueue queue = new PriorityQueue<>((o1, o2) ->{ + if (map.get(o1).equals(map.get(o2))) { + return o1.compareTo(o2); + } + return map.get(o2) - map.get(o1); + }); + queue.addAll(map.keySet()); + List result = new ArrayList<>(); + for (int i = 0; i < k; i++) { + result.add(queue.peek()); + queue.poll(); + } + return result; + } +} +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/TopKFrequentWords.md b/src/main/java/leetcode/editor/cn/TopKFrequentWords.md new file mode 100644 index 0000000..b237a70 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/TopKFrequentWords.md @@ -0,0 +1,41 @@ +

给一非空的单词列表,返回前 个出现次数最多的单词。

+ +

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

+ +

示例 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. +
  3. 输入的单词均由小写字母组成。
  4. +
+ +

 

+ +

扩展练习:

+ +
    +
  1. 尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。
  2. +
+
Related Topics
  • 字典树
  • 哈希表
  • \n
  • 👍 265
  • 👎 0
  • \ No newline at end of file