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: minHeap或maxHeap

  public String[] topKFrequent(String[] combo, int k) {
    if (combo == null || combo.length == 0) {
      return new String[0];
    }
    Map<String, Integer> hashmap = new HashMap<>();
    for (String cur : combo) {
      Integer num = hashmap.get(cur);
      hashmap.put(cur, num == null ? 1 : num + 1);
    }
    PriorityQueue<Node> pq = new PriorityQueue<>(1, new Comparator<Node>() {
      public int compare(Node a, Node b) {
        return a.val - b.val;
      }
    });
    for (Map.Entry<String, Integer> entry : hashmap.entrySet()) {
      String key = entry.getKey();
      int val = entry.getValue();
      if (pq.size() < k) {
        pq.offer(new Node(key, val));
      } else {
        if (pq.peek().val < val) {
          pq.poll();
          pq.offer(new Node(key, val));
        }
      }
    }
    int start = k - 1;
    if (k > pq.size()) {
      start = pq.size() - 1;
    }
    String[] ans = new String[start + 1];
    for (int i = start; i >= 0; i--) {
      ans[i] = pq.poll().key;
    }
    return ans;
  }
  class Node {
    String key; int val;
    public Node(String s, int v) {
      key = s;
      val = v;
    }
  }

results matching ""

    No results matching ""