Top K Frequent Words

Given a non-empty list of words, return the k most frequent elements.
Your answer should be sorted by frequency from highest to lowest. If two words have the same frequency, then the word with the lower alphabetical order comes first.

Example 1:

Input: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
Output: ["i", "love"]

Approach

Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;

public class TopKFrequentWords {
    public static void main(String[] args) {
        String[] strs = { "i""love""link""i""love""coding" };
        int k = 2;
        List<Stringfreq = topKFrequent(strs, k);
        System.out.println(Arrays.asList(freq));
    }

    // function to find the top k
    // frquent strings
    static List<StringtopKFrequent(String[] wordsint k) {
        Map<StringIntegerhashmap = new HashMap<>();
        // count the frequency of words
        for (String s : words)
            hashmap.put(s, hashmap.getOrDefault(s, 0) + 1);

        Queue<Stringpq = new PriorityQueue<>(
                (a, b) -> hashmap.get(a).equals(hashmap.get(b)) ? 
                a.compareTo(b) : hashmap.get(b) - hashmap.get(a));

        // add element in priority queue
        for (String s : hashmap.keySet())
            pq.add(s);

        List<Stringans = new ArrayList<>();
        for (int i = 0; i < k; i++)
            ans.add(pq.poll());
        return ans;
    }

}

C++

#include <bits/stdc++.h>
using namespace std;

//comparator used for sorting
static bool cmp(pair<intpair<stringint>> apair<int
              pair<stringint>> b)
{
    if (a.first == b.first)
    {
        return a.second.first < b.second.first;
    }

    return a.first > b.first;
}

//function to find the top k
//frquent strings
vector<stringtopKFrequent(vector<string&wordsint k)
{
    map<stringintmp;
    for (int i = 0i < words.size(); i++)
        mp[words[i]]++;
    vector<pair<intpair<stringint>>> v;
    for (int i = 0i < words.size(); i++)
    {
        v.push_back({mp[words[i]], {words[i]i}});
    }
    sort(v.begin(), v.end(), cmp);
    set<stringst;
    vector<stringres;
    for (int i = 0i < v.size() && k > 0i++)
    {

        if (st.find(v[i].second.first== st.end())
        {
            res.push_back(v[i].second.first);
            k--;
        }
        st.insert(v[i].second.first);
    }
    return res;
}

int main()
{

    vector<stringstrs = {"i""love""link""i""love""coding"};
    int k = 2;
    vector<stringfreq = topKFrequent(strsk);
    cout << "[";
    for (int i = 0i < freq.size() - 1i++)
        cout << freq[i] << ", ";
    cout << freq[freq.size() - 1] << "]";
    return 0;
}


No comments:

Post a Comment