All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0601_0700.s0692_top_k_frequent_words.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
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