g0601_0700.s0692_top_k_frequent_words.Solution Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of leetcode-in-java21 Show documentation
Show all versions of leetcode-in-java21 Show documentation
Java-based LeetCode algorithm problem solutions, regularly updated
package g0601_0700.s0692_top_k_frequent_words;
// #Medium #String #Hash_Table #Sorting #Heap_Priority_Queue #Counting #Trie #Bucket_Sort
// #Level_1_Day_15_Heap #2022_03_22_Time_11_ms_(38.54%)_Space_45.1_MB_(53.98%)
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
/**
* 692 - Top K Frequent Words\.
*
* Medium
*
* Given an array of strings `words` and an integer `k`, return _the_ `k` _most frequent strings_.
*
* Return the answer **sorted** by **the frequency** from highest to lowest. Sort the words with the same frequency by their **lexicographical order**.
*
* **Example 1:**
*
* **Input:** words = ["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:** words = ["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.
*
* **Constraints:**
*
* * `1 <= words.length <= 500`
* * `1 <= words[i] <= 10`
* * `words[i]` consists of lowercase English letters.
* * `k` is in the range `[1, The number of **unique** words[i]]`
*
* **Follow-up:** Could you solve it in `O(n log(k))` time and `O(n)` extra space?
**/
public class Solution {
/*
* O(n) extra space
* O(nlogk) time
*/
public List topKFrequent(String[] words, int k) {
Map map = new HashMap<>();
for (String word : words) {
map.put(word, map.getOrDefault(word, 0) + 1);
}
SortedSet> sortedset =
new TreeSet<>(
(e1, e2) -> {
if (e1.getValue().intValue() != e2.getValue().intValue()) {
return e2.getValue() - e1.getValue();
} else {
return e1.getKey().compareToIgnoreCase(e2.getKey());
}
});
sortedset.addAll(map.entrySet());
List result = new ArrayList<>();
Iterator> iterator = sortedset.iterator();
while (iterator.hasNext() && k-- > 0) {
result.add(iterator.next().getKey());
}
return result;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy