• 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;
    }
  • 相关阅读:
    css 之 input 的提交样式
    JSON 没错又是它!!!
    json 对象解析 function 里面的return 和return false 查找字符串最后的结尾字符
    sql 中update 对字符串进行批量替换
    17 常用模块
    16 模块深入
    15 模块
    14 生成器,生成器表达式,内置函数,面向过程编程
    13 迭代器
    12 递归 三元表达式 列表生成式 字典生成式 匿名函数
  • 原文地址:https://www.cnblogs.com/zmmm/p/13620311.html
Copyright © 2020-2023  润新知