当前位置: 首页 > news >正文

LeetCode:347.前K个高频元素

方法 1:用 vector 存储键值对,按频率排序(简单直接)
class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {// 1. 统计每个元素的频率unordered_map<int, int> freq;for (int num : nums) {freq[num]++;}// 2. 将键值对存入vector,便于按频率排序vector<pair<int, int>> freq_vec(freq.begin(), freq.end());// 3. 按频率降序排序(第二个元素是频率)sort(freq_vec.begin(), freq_vec.end(), [](const pair<int, int>& a, const pair<int, int>& b) {return a.second > b.second; // 频率高的排在前});// 4. 取前k个元素的键vector<int> result;for (int i = 0; i < k; ++i) {result.push_back(freq_vec[i].first);}return result;}
};
进阶方法 2:用优先队列(堆)优化(时间复杂度 O (n log k))
class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {// 1. 统计频率unordered_map<int, int> freq;for (int num : nums) {freq[num]++;}// 2. 用小顶堆存储前k个高频元素(堆顶是最小的高频元素)// 堆中元素是 (频率, 元素),按频率升序排列priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;for (auto& pair : freq) {pq.push({pair.second, pair.first});// 当堆大小超过k,弹出最小的高频元素if (pq.size() > k) {pq.pop();}}// 3. 从堆中取出结果(此时堆中是前k个高频元素)vector<int> result;while (!pq.empty()) {result.push_back(pq.top().second);pq.pop();}// 由于堆是小顶堆,结果是从小到大的,如需保持高频在前可反转reverse(result.begin(), result.end());return result;}
};

用小顶堆只保留前 k 个高频元素,每次插入后若超过 k 就弹出最小的,效率更高,尤其当 n 很大而 k 较小时。

    http://www.dtcms.com/a/319621.html

    相关文章:

  • 手写数字识别实战 - 从传统机器学习到深度学习
  • 13-netty基础-手写rpc-消费方生成代理-05
  • Qt——入门
  • 数据赋能(386)——数据挖掘——迭代过程
  • Spring、Spring MVC、MyBatis 和 Spring Boot的关系
  • Ethereum:如何优雅部署 NPM 包中的第三方智能合约?
  • LoadBalancingSpi
  • Beelzebub靶机
  • MyCAT实战环节
  • 动手学深度学习13.10. 转置卷积 -笔记练习(PyTorch)
  • 在新建word中使用以前文件中的列表样式
  • Python调用Shell指令的方法与实践
  • 深海中的类型晨曦
  • Jmeter使用第一节-认识面板(Mac版)
  • 初识C++类的6个默认成员函数
  • 以复合赋值运算符(op=)优化单独运算符(op)的实现
  • BKP 与 RTC 时钟
  • 从Text2SQL到Text2Metrics:衡石指标管理技术跃迁
  • 【Bluedroid】蓝牙音频接收端活动设备切换机制深度解析(sink_set_active_device)
  • 密码学侧信道攻击(Side-channel Attack):从物理泄露中窃取密钥
  • 水库大坝安全监测系统主要概述
  • 护网行动之后:容器安全如何升级?微隔离打造内网“微堡垒”
  • SkyWalking-1--SkyWalking是什么?
  • 基于MATLAB实现支持向量机(SVM)分类
  • `/dev/vdb` 是一个新挂载的 4TB 硬盘,但目前尚未对其进行分区和格式化。
  • WebSocket 在多线程环境下处理 Session并发
  • 多数据中心运维:别让 “分布式” 变成 “混乱式”
  • 机器学习 [白板推导](七)[概率图模型]
  • QtC++ 中使用 qtwebsocket 开源库实现基于websocket的本地服务开发详解
  • 30-Hive SQL-DML-Load加载数据