347.前k个高频元素

简介: 347.前k个高频元素

347.前k个高频元素


小白解法

class Solution
{
public:
    static bool compare(const pair<int, int> &a, const pair<int, int> &b)
    {
        if (a.second == b.second)
            return a.first < b.first;
        else
            return a.second > b.second;
    }
    vector<int> topKFrequent(vector<int> &nums, int k)
    {
        map<int, int> Hash;
        for (int i = 0; i < nums.size(); i++)
        {
            if (!Hash.count(nums[i]))
            {
                Hash.emplace(nums[i], 1);
            }
            else
            {
                Hash[nums[i]]++;
            }
        }
        vector<pair<int, int>> v(Hash.begin(), Hash.end()); //将map中的元素拷贝到vector中
        sort(v.begin(), v.end(), compare);
        vector<int> ans;
        for (int i = 0; i < k; i++)
        {
            ans.push_back(v[i].first);
        }
        return ans;
    }
};


通过哈希表统计每个元素的出现频率,然后通过将map中的元素拷贝到vector中进行排序,得到前k个元素。快速排序时间复杂度O(nlogn),不满足题目要求,需要优化。


易错点

类成员函数compare()需要static进行修饰。这是因为所有我们在类内定义的非static成员函数在经过编译后隐式的为他们添加了一个this指针参数!变为了:bool compare(Solution *this, int a, int b),而标准库的sort()函数的第三个cmp函数指针参数中并没有这样this指针参数,因此会出现输入的cmp参数和sort()要求的参数不匹配,从而导致了:error: reference to non-static member function must be called,而static静态类成员函数是不需要this指针的,因此改为静态成员函数即可通过!


优先队列(最小堆)

class Solution
{
public:
    class mycomparison
    {
    public
        bool operator()(const pair<int, int> &lhs, const pair<int, int> &rhs)
        {
            return lhs.second > rhs.second;
        }
    };
    vector<int> topKFrequent(vector<int> &nums, int k)
    {
        unordered_map<int, int> map;
        for (int i = 0; i < nums.size(); i++)
        {
            map[nums[i]]++;
        }
        priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;
        for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++)
        {
            pri_que.push(*it);
            if (pri_que.size() > k)
            {
                pri_que.pop();
            }
        }
        //最小堆先弹出最小的,所以倒叙输出
        vector<int> result(k);
        for (int i = k - 1; i >= 0; i--)
        {
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;
    }
};


先遍历一遍数组统计各元素出现频率,然后用一个最小堆,保证当堆的大小大于k时,最小值弹出,保证堆的大小一直是k。最后得到的就是前k个高频元素。最后,最小堆先弹出最小的,所以倒叙输出。


桶排序

class Solution
{
public:
    vector<int> topKFrequent(vector<int> &nums, int k)
    {
        // key=元素值, value=出现频率
        unordered_map<int, int> counts;
        int maxCount = 0;
        for (int num : nums)
        {
            maxCount = max(maxCount, ++counts[num]); // 找到最大的频率
        }
        vector<vector<int>> buckets(maxCount + 1); // 以出现频率为桶个数
        for (auto p : counts)
        {
            buckets[p.second].push_back(p.first);
        }
        vector<int> ans;
        for (int i = maxCount; i > 0 && ans.size() < k; --i)
        {
            for (int num : buckets[i])
            {
                ans.push_back(num);
                if (ans.size() == k)
                {
                    break;
                }
            }
        }
        return ans;
    }
};


首先通过哈希表统计每个元素的出现频率,然后以最大出现频率为桶个数,倒叙返回前k个元素。其实小白解法中的思想有类似之处,但小白使用的快排复杂度太高,这里的桶排序的复杂度只有O(n+k)。

目录
相关文章
|
2天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
12天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
473 199
|
4天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
583 157
|
4天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。
|
10天前
|
人工智能 自然语言处理 安全
国内主流Agent工具功能全维度对比:从技术内核到场景落地,一篇读懂所有选择
2024年全球AI Agent市场规模达52.9亿美元,预计2030年将增长至471亿美元,亚太地区增速领先。国内Agent工具呈现“百花齐放”格局,涵盖政务、金融、电商等多场景。本文深入解析实在智能实在Agent等主流产品,在技术架构、任务规划、多模态交互、工具集成等方面进行全维度对比,结合市场反馈与行业趋势,为企业及个人用户提供科学选型指南,助力高效落地AI智能体应用。
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
573 46