前 K 个高频元素(力扣刷题代码随想录刷题)

news2024/11/20 13:41:04

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

 

思路:

  1. 要统计元素出现频率
  2. 对频率排序
  3. 找出前K个高频元素

        首先统计元素出现的频率,这一类的问题可以使用map来进行统计。

        然后是对频率进行排序,这里我们可以使用一种 容器适配器就是优先级队列

什么是优先级队列呢?

        其实就是一个披着队列外衣的堆,因为优先级队列对外接口只是从队头取元素,从队尾添加元素,再无其他取元素的方式,看起来就是一个队列。

而且优先级队列内部元素是自动依照元素的权值排列。那么它是如何有序排列的呢?

        缺省情况下priority_queue利用max-heap(大顶堆)完成对元素的排序,这个大顶堆是以vector为表现形式的complete binary tree(完全二叉树)。

        什么是堆呢?

        堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。 如果父亲结点是大于等于左右孩子就是大顶堆,小于等于左右孩子就是小顶堆。

        所以大家经常说的大顶堆(堆头是最大元素),小顶堆(堆头是最小元素),如果懒得自己实现的话,就直接用priority_queue(优先级队列)就可以了,底层实现都是一样的,从小到大排就是小顶堆,从大到小排就是大顶堆。

        本题我们就要使用优先级队列来对部分频率进行排序。

        那么问题来了,定义一个大小为k的大顶堆,在每次移动更新大顶堆的时候,每次弹出都把最大的元素弹出去了,那么怎么保留下来前K个高频元素呢。

而且使用大顶堆就要把所有元素都进行排序,那能不能只排序k个元素呢?

        所以我们要用小顶堆,因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。

// 时间复杂度:O(nlogk)
// 空间复杂度:O(n)
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; // map<nums[i],对应出现的次数>
        for (int i = 0; i < nums.size(); i++) {
            map[nums[i]]++;
        }

        // 对频率排序
        // 定义一个小顶堆,大小为k
        priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;

        // 用固定大小为k的小顶堆,扫面所有频率的数值
        for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {
            pri_que.push(*it);
            if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
                pri_que.pop();
            }
        }

        // 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
        vector<int> result(k);
        for (int i = k - 1; i >= 0; i--) {
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;

    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/418669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

商汤科技推出“日日新SenseNova”,大模型体系赋能人工智能新未来

2023年4月10日&#xff0c;商汤科技SenseTime技术交流日活动在上海举行&#xff0c;分享了以“大模型大算力”推进AGI&#xff08;通用人工智能&#xff09;发展的战略布局&#xff0c;并公布了商汤在该战略下的“日日新SenseNova”大模型体系。 公开信息显示&#xff0c;商汤科…

使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录

兄弟们天天看基础看腻了吧 今天来分享一下如何使用Python突破某网游游戏JS加密限制&#xff0c;进行逆向解密&#xff0c;实现自动登录。 逆向目标 目标&#xff1a;某 7 网游登录主页&#xff1a;aHR0cHM6Ly93d3cuMzcuY29tLw接口&#xff1a;aHR0cHM6Ly9teS4zNy5jb20vYXBpL…

面试了上百位性能测试后,我发现了一个令人不安的事实...

在企业中负责技术招聘的同学&#xff0c;肯定都有一个苦恼&#xff0c;那就是招一个合适的测试太难了&#xff01;若要问起招哪种类型的测试最难时&#xff0c;相信很多人都会说出“性能测试”这个答案。 每当发布一个性能测试岗位&#xff0c;不一会就能收到上百份简历&#…

商会协会入会资源需求活动小程序开发

商会协会入会资源需求活动小程序开发 功能列表&#xff1a; 用户注册&#xff1a;用户可以通过小程序注册账号并加入商会协会。会员管理&#xff1a;可以管理会员的基本信息&#xff0c;包括个人信息、公司信息、会员资格等级等。同时&#xff0c;管理者可以根据会员等级制定…

JavaSE抽象类和接口

文章目录JavaSE抽象类和接口一、抽象类1、抽象类概念2、抽象类特性二、接口1、接口概念2、接口特性3、多接口4、接口之间的继承5、常用接口使用6、抽象类和接口的区别三、Object类JavaSE抽象类和接口 一、抽象类 1、抽象类概念 一个类中没有包含足够的信息来描绘一个具体的对…

最长公共子序列(动态规划)

Time Limit: 1 Sec Memory Limit: 128 Mb Description 求两个序列的最每组测试样例都为一行&#xff0c;两组字符串&#xff0c;每组不超过1000&#xff0c;用空格隔开。求最长公共子序列&#xff0c;都为小写字母。Input 每组测试样例都为一行&#xff0c;两组字符…

PHP快速入门03-面向对象编程

文章目录前言面向对象编程关于PHP的面向对象编程类的默认方法和属性面向对象编程示例总结前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 面向对象编程 关于PHP的面向对象编程 PHP的面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP…

OK-3399-C ADB烧录

ADB烧写 一、OK3399用户资料工具目录附带了ADB工具的资料包路径&#xff1a; 二、将其解压在C:\User目录 三、将设备通过type-c线download口与电脑相连接&#xff0c;打开命令行&#xff0c;进入解压的目录&#xff0c;查看adb是否安装成功&#xff1a; 四、安装成功后&#x…

gpt4all保姆级使用教程! 不用联网! 本地就能跑的GPT

原文&#xff1a;gpt4all保姆级使用教程! 不用联网! 本地就能跑的GPT 什么是gpt4all gpt4all是在大量干净数据上训练的一个开源聊天机器人的生态系统。它不用科学上网&#xff01;甚至可以不联网&#xff01;本地就能用&#xff0c;像这样↓&#xff1a; 如何使用&#xff…

【针对项目在线OJ系统的测试】:Junit+Selenium

目录 一、背景介绍&#xff1a; 二、导入的依赖&#xff1a; 三、测试模块1&#xff1a;index页面的测试 测试点1&#xff1a;测试"我的OJ系统这4个字是否存在" 测试点2&#xff1a;测试"题目列表"这4个字是否存在 测试点3&#xff1a;测试"编号…

设计模式(十二)之装饰器模式

文章目录什么是装饰器模式例子&#xff1a;总结什么是装饰器模式 现在有一块蛋糕&#xff0c;涂上奶油就变成了奶油蛋糕&#xff0c;如果加上草莓就是草莓奶油蛋糕&#xff0c;再加上蜡烛就变成了生日蛋糕。 程序中的对象与蛋糕十分相似。将对象类比成蛋糕&#xff0c;不断的加…

Faster-RCNN代码解读6:主要文件解读-中

Faster-RCNN代码解读6&#xff1a;主要文件解读-中 前言 ​ 因为最近打算尝试一下Faster-RCNN的复现&#xff0c;不要多想&#xff0c;我还没有厉害到可以一个人复现所有代码。所以&#xff0c;是参考别人的代码&#xff0c;进行自己的解读。 ​ 代码来自于B站的UP主&#xff…

Qt音视频开发36-超时检测和自动重连的设计

一、前言 如果网络环境正常设备正常&#xff0c;视频监控系统一般都是按照正常运行下去&#xff0c;不会出现什么问题&#xff0c;但是实际情况会很不同&#xff0c;奇奇怪怪七七八八的问题都会出现&#xff0c;就比如网络出了问题都有很多情况&#xff08;交换机故障、网线故…

TensorFlow 1.x 深度学习秘籍:11~14

原文&#xff1a;TensorFlow 1.x Deep Learning Cookbook 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如…

持续集成——通过docker命令安装Jenkins

一、持续集成体系介绍 1、核心价值&#xff1a; 集成自动化测试&#xff0c;减少重复劳动 尽早发现和解决缺陷,减少风险 形成有机整体&#xff0c;明确阶段交付物 2、常见集成方案 a、阶段化 为不同的构建测试套件建立不同的CI循环周期 单元测试运行时间短&#xff0c;反馈…

测试基础篇

目录软件测试的生命周期测试用例设计如何描述一个bug如何创建一个Bug案例Bug的级别Bug的生命周期测试人员和开发人员产生争执了怎么办&#xff1f;软件测试的生命周期 软件测试的生命周期&#xff1a;需求分析→测试计划→测试设计、软件开发→测试执行→测试评估 软件测试&a…

AXI DMA

PG021 AXI DMA&#xff1a;AXI Direct Memory Access AXI DMA为内存和AXI4-Stream外设之间提供了高带宽的直接内存访问&#xff0c;其可选的S/G功能可以将CPU从数据搬运任务中解放出来。 AXI DMA通过AXI4-LITE接口对寄存器做一些配置和获取 MM2S&#xff1a;MemoryMap to St…

css 盒模型

CSS 中的盒子模型包括 IE 盒子模型和标准的 W3C 盒子模型。 box-sizing(有 3 个值哦)&#xff1a;border-box,padding-box,content-box 这两种盒子模型最主要的区别就是 width 的包含范围&#xff1a; 在 标准的盒子模型中&#xff0c;width只是 content 部分&#xff08;b…

嵌入式51单片机02-独立按键系列

文章目录独立按键一. 独立按键基础知识二. 独立按键系列代码1. 独立按键控制LED&#xff08;按下灯亮&#xff0c;松开灯灭&#xff09;&#xff08;1&#xff09;仿真电路图&#xff08;2&#xff09;源代码&#xff08;3&#xff09;实验结果2. 独立按键控制LED&#xff08;按…

聚观早报|阿里云正式推出通义千问;京东零售开启5年最大组织变革

今日要闻&#xff1a;国家网信办规范生成式人工智能服务&#xff1b;阿里云正式推出通义千问&#xff1b;京东零售开启5年来最大组织变革&#xff1b;飞书将推出智能AI助手「My AI」&#xff1b;乐高将继续扩大在华零售布局国家网信办规范生成式人工智能服务 4 月 11 日&#x…