zoukankan      html  css  js  c++  java
  • 前 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;
    }
  • 相关阅读:
    如何学习掌握一门新技术
    Linux多线程编程(不限Linux)
    腾讯后台开发面试题2
    腾讯后台开发面试题
    【转】Linux杀死fork产生的子进程的僵尸进程defunct
    【转】Linux网络编程入门
    【转】揭开Socket编程的面纱
    【转】简单理解socket
    【转】404、500、502等HTTP状态码介绍
    【转】fread函数和fwrite函数
  • 原文地址:https://www.cnblogs.com/lancelee98/p/13262309.html
Copyright © 2011-2022 走看看