Skip to content

67 Top K Frequent Words (Lai)

Given a composition with different kinds of words, return a list of the top K most frequent words in the composition.

Assumptions

  • the composition is not null and is not guaranteed to be sorted
  • K >= 1 and K could be larger than the number of distinct words in the composition, in this case, just return all the distinct words

Return

  • a list of words ordered from most frequent one to least frequent one (the list could be of size K or smaller than K)

Examples

  • Composition = ["a", "a", "b", "b", "b", "b", "c", "c", "c", "d"], top 2 frequent words are [“b”, “c”]
  • Composition = ["a", "a", "b", "b", "b", "b", "c", "c", "c", "d"], top 4 frequent words are [“b”, “c”, "a", "d"]
  • Composition = ["a", "a", "b", "b", "b", "b", "c", "c", "c", "d"], top 5 frequent words are [“b”, “c”, "a", "d"]

Solution:

public class Solution {
  public String[] topKFrequent(String[] combo, int k) {
    // Write your solution here
    // base case
    if (combo == null || combo.length < 1){
      return combo;
    }

    Map<String, Integer> map = new HashMap<String, Integer>();
    for (String word : combo){
      if (map.containsKey(word)){
        map.put(word, map.get(word) + 1);
      }else{
        map.put(word, 1);
      }
    }

    PriorityQueue<Map.Entry<String, Integer>> minHeap = new PriorityQueue<Map.Entry<String, Integer>>(k, 
    new Comparator<Map.Entry<String, Integer>>(){
      @Override
      public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2){
        return e1.getValue().compareTo(e2.getValue()); // e1 > e2 >     re>0
      }
    }
    );

    for (Map.Entry<String, Integer> entry : map.entrySet()){
      if (minHeap.size() < k){
        minHeap.offer(entry);
      }else{
        if (entry.getValue() > minHeap.peek().getValue()){
          minHeap.poll();
          minHeap.offer(entry);
        }
      }
    }

    String[] result = new String[minHeap.size()];
    for (int i = minHeap.size() - 1; i >= 0; i--){
      result[i] = minHeap.poll().getKey();
    }

    return result;


  }
}


// TC: O(n+nlogk) = O(nlogn)
// SC: O(n)