文章标题

来源:互联网 发布:sql server 2016 sp1 编辑:程序博客网 时间:2024/05/31 18:55
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 = 2Output: ["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: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4Output: ["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.Note:You may assume k is always valid, 1 ≤ k ≤ number of unique elements.Input words contain only lowercase letters.

本题用trie树即可解决,但是还是需要多思考。

typedef struct TrieNode{    int freq;    int count;/*flag this is a complete word*/    struct TrieNode * next[26];}TrieNode,*Trie;TrieNode* createTrieNode(){    TrieNode* node = (TrieNode *)malloc(sizeof(TrieNode));    node->freq = 0;    node->count = 0;    memset(node->next , 0 , sizeof(node->next));    // 初始化为空指针    return node;}int insertTrieNode(TrieNode *root,const char *word){    TrieNode * node = root;    const char *p = word;    int key = 0;    if(root == NULL||p == NULL || strlen(word) == 0){        return -1;    }    while(*p){        key = *p - 'a';        if(key < 0 || key >= 26){            return -1;        }        if(node->next[key] == NULL){            node->next[key] = createTrieNode();        }        node = node->next[key];        node->freq += 1;        ++p;    }    node->count += 1;    return 0;}int searchTrie(TrieNode *root,const char *word){    TrieNode * node = root;    const char *p = word;    int key = 0;    if(root == NULL||p == NULL || strlen(word) == 0){        return -1;    }    while(*p){        key = *p-'a';        if(key < 0 || key >= 26){            return -1;        }        if(node->next[key] == NULL){            return 0;        }        node = node->next[key];        ++p;    }    return node->count;}int cmp(const pair<string, int>& x, const pair<string, int>& y)    {        return x.second > y.second;    }    void sortMapByValue(map<string, int>& tMap,vector<pair<string, int> >& tVector)    {        for (map<string, int>::iterator curr = tMap.begin(); curr != tMap.end(); curr++)             tVector.push_back(make_pair(curr->first, curr->second));          sort(tVector.begin(), tVector.end(), cmp);    }    class Solution {public:    vector<string> topKFrequent(vector<string>& words, int k) {        TrieNode * root = createTrieNode();        map<string,int> wordCount;        vector<pair<string,int>> wordVec;        vector<string> result;        for(int i = 0;i < words.size();++i){            insertTrieNode(root,words[i].c_str());        }        for(int i = 0;i < words.size();++i){            int cnt = searchTrie(root,words[i].c_str());            wordCount.insert(pair<string, int>(words[i],cnt));        }        map<string,int>::iterator it;        it = wordCount.begin();        while(it!=wordCount.end()){            cout<<it->first<<":"<<it->second<<endl;            it++;        }        sortMapByValue(wordCount,wordVec);        for(int i = 0;i < k; ++i){            result.push_back(wordVec[i].first);        }        return result;    }};
原创粉丝点击