前 K 个高频元素

问题描述 :

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

 

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2

输出: [1,2]

示例 2:

输入: nums = [1], k = 1

输出: [1]

 

说明:

你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。

你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。

题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。

输出时,首先输出频率最高的元素,如果频率相同,则先输出元素值较大的元素。

 

输入说明 :

首先输入nums数组的长度n,

然后输入n个整数,以空格分隔。

最后输入k。

输出说明 :

首先输出频率最高的元素,如果频率相同,则先输出元素值较大的元素。

元素之间以空格分隔。

 

输入范例 :

8
1 1 1 2 2 3 3 4
3

输出范例 :

1 3 2

#include<iostream>
#include<map>
#include<queue>
#include<vector>
using namespace std;
class Solution {
public:
    struct Cell
    {
        pair<int, int> data;
        Cell(pair<int, int> _data) :data(_data) {};
        bool operator <(const Cell& c) const
        {
            if (data.second > c.data.second)
                return  1;
            else if (data.second == c.data.second)
                return data.first > c.data.first;
            else
                return 0;
        }
    };
    //使用小顶堆 满了的时候把最小的pop出去 剩下的就是k个频率最高的
    vector<int> topKFrequent(vector<int>& nums, int k) {
        vector<int> res;
        map<int, int> hash;
        for (auto item : nums)
            hash[item]++;
        priority_queue<Cell> que;//小顶堆
        for (auto a : hash)
        {
            que.push(make_pair(a.first, a.second));
            if (que.size() > k) que.pop();
        }
        while (!que.empty())
        {
            res.push_back(que.top().data.first);
            que.pop();
        }
        return res;
    }
};
int main()
{
    vector<int> v;
    vector<int> res;
    int len, n;
    int data;
    cin >> len;
    for (int i = 0; i < len; i++)
    {
        cin >> data;
        v.push_back(data);
    }
    cin >> n;
    res = Solution().topKFrequent(v, n);
    int size = res.size();
    for (int i = size - 1; i > 0; i--)
        cout << res[i] << " ";
    cout << res[0]<<endl;
    return 0;
}

 

 

posted @ 2020-07-07 18:00  lancelee98  阅读(170)  评论(0编辑  收藏  举报