zoukankan      html  css  js  c++  java
  • (leetcode题解)Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements.

    For example,
    Given [1,1,1,2,2,3] and k = 2, return [1,2].

    Note: 

    • You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
    • Your algorithm's time complexity must be better than O(n log n), where n is the array's size.

    对于这种统计出现个数的题目,一般用map或unordered_map进行统计先,我开始的想法是通过统计之后,再用sort函数对pair的second进行排序输出,不过在leetcode的编译器一直不能识别重新定义的比较算法,我试着在本地ide上运行是可以通过的。

    贴出C++代码:

    //重新定义的比较函数
    bool compete(const pair<int,int>& a,const pair<int,int>& b)
    {
        return a.second > b.second;
    }
    vector<int> topKFrequent(vector<int>& nums, int k) {
        map<int,int> vec;
        vector<int> res;
        vector<pair<int,int>> m_pair;
        for(int i=1;i<nums.size();i++)
        {
            vec[nums[i]]++;
        }
        for(auto &i:vec)
            m_pair.push_back(i);
        sort(m_pair.begin(),m_pair.end(),compete);  //通过比较second排序
        auto iter=m_pair.begin();
        for(int i=0;i<k;i++)
        {
            res.push_back(iter->first);
            iter++;
        }
        return res;
    }

    之后我改为优先队列,即统计个数之后,用优先队列对pair的second进行排序,再输出前k个即可,代码如下

    vector<int> topKFrequent(vector<int>& nums, int k) {
            map<int,int> vec;
            vector<int> res;
            priority_queue<pair<int,int>> p;
            for(int i=0;i<nums.size();i++)
            {
                vec[nums[i]]++;
            }
            for(auto &i:vec)
                p.push(make_pair(i.second,i.first));    //比较的是second
            for(int i=0;i<k;i++)
            {
                res.push_back(p.top().second);
                p.pop();
            }
            return res;
        }
  • 相关阅读:
    第二阶段团队冲刺第二天站立会议
    第二阶段冲刺第一天站立会议
    对身边常用的软件进行评价
    学习进度条
    进度条
    团队冲刺第四天站立会议
    用户模板及场景分析
    团队冲刺第一天战略会议
    团队冲刺第九天
    团队冲刺第八天
  • 原文地址:https://www.cnblogs.com/kiplove/p/6957474.html
Copyright © 2011-2022 走看看