-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path0692.前k个高频单词.java
93 lines (86 loc) · 2.45 KB
/
0692.前k个高频单词.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
* @lc app=leetcode.cn id=692 lang=java
*
* [692] 前K个高频单词
*
* https://leetcode.cn/problems/top-k-frequent-words/description/
*
* algorithms
* Medium (56.19%)
* Likes: 573
* Dislikes: 0
* Total Accepted: 109.4K
* Total Submissions: 194.9K
* Testcase Example: '["i","love","leetcode","i","love","coding"]\n2'
*
* 给定一个单词列表 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) 空间复杂度解决。
*
*/
// @lc code=start
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
class Solution {
public List<String> topKFrequent(String[] words, int k) {
Map<String, Integer> map = new HashMap<>();
for (String word : words)
map.put(word, map.getOrDefault(word, 0) + 1);
PriorityQueue<Map.Entry<String, Integer>> pq = new PriorityQueue<>(k,
(o1, o2) -> {
int num = o1.getValue() - o2.getValue();
return num != 0 ? num : o2.getKey().compareTo(o1.getKey());
});
for (Map.Entry<String, Integer> entry : map.entrySet()) {
pq.offer(entry);
if (pq.size() > k)
pq.poll();
}
List<String> result = new ArrayList<>();
while (!pq.isEmpty())
result.add(pq.poll().getKey());
Collections.reverse(result);
return result;
}
}
// @lc code=end