HOT75-前K个高频元素

news/2025/3/25 10:27:11/

        leetcode原题链接:前 K 个高频元素

题目描述  

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

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

提示:

  • 1 <= nums.length <= 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

解题方法:小顶堆+map。先用map统计出各个数字出现的次数,然后根据出现次数的优先级将<num, count>压入小顶堆中。之后遍历map中的<num, count>对,先压入k个元素到堆顶中,之后将各个元素跟堆顶大小比较。如果当前元素比堆顶元素小,则直接忽略;如果当前元素比堆顶元素大,则弹出堆顶元素,压入当前元素,并调整堆。一直维持堆的大小为k,最后遍历完map中的所有元素后,剩下的堆中的元素即为结果集。

C++代码

#include <iostream>
#include <map>
#include <queue> // std::priority_queue
#include <vector>
class Solution {
public:std::vector<int> topKFrequent(std::vector<int>& nums, int k) {int n = nums.size();if (k > n) {return {};}std::map<int, int> mp;// 1. 先计算每个元素的个数for (auto num : nums) {mp[num]++;}// 2. 采用小顶堆收集结果,维持堆的元素个数为kusing pairType = std::pair<int, int>;auto cmp = [](auto p1, auto p2) { //定义小顶堆(greater)的比较函数return p1.second > p2.second;};std::priority_queue<pairType,std::vector<pairType>, decltype(cmp)> pq(cmp); //保存<num, count>pair,采用int k_num = 0;for (auto vp : mp) {int num = vp.first;int cnt = vp.second;if (k_num < k) { //先初始化k个元素pq.push(vp);k_num++;} else if (cnt >= pq.top().second) { //维持最大k个元素的小顶堆pq.pop();//先弹出堆顶元素pq.push(vp);//在压入比原堆顶更大的元素}}// 3.收集结果std::vector<int> result;while (!pq.empty()) {result.emplace_back(pq.top().first);pq.pop();}return result;}
};

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

相关文章

【力扣每日一题】2023.8.6 两两交换链表中的节点

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个链表&#xff0c;让我们两两交换相邻节点的值&#xff0c;并且不能通过修改节点内部的值来达到这一目的&#xff0c;如果可…

规范Commit格式

规范Commit格式 Jenkins根据对比当次构建和上次构建的Commit信息来生成ChangeLog&#xff0c;但因为我们目前的提交不够规范&#xff0c;经常有类似"#","update"这列的提交&#xff0c;无法提供给PM有效的更新记录&#xff0c;所以建议大家尽量规范Commit…

合并两个有序链表(leetcode)

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]思路 每次递归都会比较当前两个节点的值&#xff0c;选择较小的节点作为合并后的链…

系列3-常见的高可用MySQL解决方案

高可用主要解决两个问题&#xff0c;如何实现数据共享和同步数据、如何处理failover&#xff0c;数据共享的解决方案一般是SAN&#xff0c;数据同步通过rsync和drbd技术来实现。 1、主从复制解决方案 这是MySQL自身的高可用解决方案&#xff0c;数据同步方法采用的是MySQL rep…

python字符串输入输出与注解

目录 数据输入 前言 数据输出 字符串 字符串的三种定义方法 引号嵌套 字符串的拼接 字符串格式化 拼接字符串缺点 python常用的格式符号 格式化的精度控制 字符串快速格式化 快速格式化特点 对表达式进行格式化 具体案例 字符串的大小比较 字符串比较方式 变…

Java课设--学生信息管理系统(例1)

文章目录 前提一、运行效果二、Text实现类三、Manage选择类四、StudentWay学生方法类五、StudnetSql数据库类 前题 例1为无使用GUI图形界面&#xff0c;例2使用GUI图形界面&#xff01; 首先自己的JDBC驱动已经接好了&#xff0c;连接自己的数据库没有问题。连接数据库可以看…

【李宏毅机器学习·学习笔记】Tips for Training: Adaptive Learning Rate

本节课主要介绍了Adaptive Learning Rate的基本思想和方法。通过使用Adaptive Learning Rate的策略&#xff0c;在训练深度神经网络时程序能实现在不同参数、不同iteration中&#xff0c;学习率不同。 本节课涉及到的算法或策略有&#xff1a;Adgrad、RMSProp、Adam、Learning …

桐乡嘉兴平面设计培训_PS一对一速成培训有吗

嘉兴平面设计培训_PS一对一速成培训有吗 0基础学广告海报页面培训 小班制学ps软件课程 嘉兴本地培训18年欢迎咨询 学校地址: 嘉兴市南湖区中山东路205号嘉华广场4楼416 海宁市西山路832号金贸大厦11楼1101号 桐乡市吾悦广场第吾大道&#xff08;金街&#xff09;1楼1058号 软…