18前 K 个高频元素(347)

18 前 K 个高频元素

作者: Turbo时间限制: 1S章节: DS:队列

晚于: 2020-07-15 12:00:00后提交分数乘系数50%

截止日期: 2020-07-22 12:00:00

问题描述 :

给定一个非空的整数数组,返回其中出现频率前 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 个高频元素的集合是唯一的。

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

可使用以下main函数:

int main()

{

    int n,data,k;

    vector<int> nums;

    cin>>n;

    for(int i=0; i<n; i++)

    {

        cin>>data;

        nums.push_back(data);

    }

    cin>>k;

    vector<int> res=Solution().topKFrequent(nums,k);

    for(int i=0; i<res.size(); i++)

    {

        if (i>0)

            cout<<" ";

        cout<<res[i];

    }

    return 0;

}

输入说明 :

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

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

最后输入k。

输出说明 :

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

元素之间以空格分隔。

输入范例 :

8
1 1 1 2 2 3 3 4
3

输出范例:

1 3 2
#include <queue>
#include <iostream>
#include <vector>

#include <map>

using namespace std;
class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
       map<int,int> map;
        for(int i : nums) 
            map[i] ++; //遍历
        priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > Q; //最小堆
        for(auto it : map) 
            if(Q.size() == k)
             { //队列满了
                if(it.second > Q.top().first)
                 { //堆排
                    Q.pop();
                    Q.push(make_pair(it.second, it.first));
                }
            }
            else Q.push(make_pair(it.second, it.first));
        vector<int> res;
        while(Q.size()) { //将优先队列中k个高频元素存入vector
            res.push_back(Q.top().second);
            Q.pop();
        }
        return vector<int>(res.rbegin(), res.rend());
    }

};

int main()
{
    int n,data,k;
    vector<int> nums;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>data;
        nums.push_back(data);
    }
    cin>>k;
    vector<int> res=Solution().topKFrequent(nums,k);
    for( int i=0; i<res.size(); i++)
    {
        if (i>0)
            cout<<" ";
        cout<<res[i];
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zmmm/p/13620311.html