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

347. 前 K 个高频元素

题目:
在这里插入图片描述

思考:

  1. 使用堆实现
  2. 如果采用把数组所有元素建立成大根堆然后执行k次输出根后调整的话复杂度就是nlogn会超时,且不符合要求
  3. 采用大小只有k的小根堆
  4. 遇到比小根堆更大的元素就替换小根堆的根,并进行调整
  5. 最后剩下的k个元素就是最大的k个元素
  6. 在本题中大小指代出现的频率
  7. 难点在于
    1. 获取频率
    2. 初始化和调整堆

实现:

class Solution {
public:vector<pair<int,int>> tree;int size=0;
public:vector<int> topKFrequent(vector<int>& nums, int k) {vector<int> ret;vector<pair<int,int>> number_fre;for (auto n:nums){bool find_n=false;for (auto& p:number_fre){if (p.first==n){p.second++;find_n=true;break;}}if (!find_n){number_fre.push_back(make_pair(n,1));}}init(number_fre,k);for (int i=k;i<number_fre.size();i++){if (number_fre[i].second>tree[0].second){tree[0]=number_fre[i];adjustTree(0);}}for (auto p:tree){ret.push_back(p.first);}return ret;}void init(vector<pair<int,int>> number_fre,int k ){for (int i=0;i<k;i++){tree.push_back(number_fre[i]);size++;}buildTree();}void buildTree(){int max=size/2-1;while(max>-1){adjustTree(max);max--;}}void adjustTree(int pos){while(2*pos+1<size){int left=2*pos+1;int right=2*pos+2;bool has_adjust=false;if (right<size){if (tree[left].second>tree[right].second){if (tree[right].second<tree[pos].second){swap(tree[right],tree[pos]);pos=right;has_adjust=true;// continue;}}   else{if (tree[left].second<tree[pos].second){swap(tree[left],tree[pos]);pos=left;has_adjust=true;}}}else{if (tree[left].second<tree[pos].second){swap(tree[left],tree[pos]);pos=left;has_adjust=true;} }if (!has_adjust){break;}}}
};
http://www.lryc.cn/news/574057.html

相关文章:

  • 洛谷P1217 [USACO1.5] 回文质数 Prime Palindromes
  • Rust 切片类型(slice type)
  • 关于华为Pura70Pro+升级鸿蒙NEXT和回退
  • 第三章---需求分析
  • JavaScript 中 async/await 的工作原理
  • Chromium 136 编译指南 macOS篇:编译优化技巧(六)
  • 【C++】C++中的虚函数和多态的定义与使用
  • 微软ASR与开源模型分析
  • 黑马python(十五)
  • C语言数组介绍 -- 一维数组和二维数组的创建、初始化、下标、遍历、存储,C99 变长数组
  • 三、kubectl使用详解
  • 安卓9.0系统修改定制化____如何编辑和修改安卓手机默认按键配置文件 改变按键功能 操作篇 九
  • LeetCode中K个链表的链接的解法
  • 区块链大讲堂 | 分布式隐私计算友好的零知识证明协议
  • 矩阵阶数(线性代数) vs. 张量维度(深度学习):线性代数与深度学习的基石辨析,再也不会被矩阵阶数给混淆了
  • Flink SQL执行流程深度剖析:从SQL语句到分布式执行
  • 机器学习基础:从概念到应用的全面解析
  • mac隐藏文件现身快捷键
  • Node.js 中的 JWT 认证:从生成到验证的完整指南
  • 深入浅出Node.js中间件机制
  • Apache SeaTunnel Spark引擎执行流程源码分析
  • 17、Rocket MQ快速实战以及核⼼概念详解
  • 更新麒麟连不上外网
  • 从理论到实践:Air8101外挂Air780EPM模块,实现4G联网能力!
  • 游戏盾:守护虚拟世界的坚固堡垒
  • 「Linux用户账号管理」组群管理
  • ActixWeb框架实战案例精萃
  • DAY 40 训练和测试的规范写法
  • 详解HarmonyOS NEXT仓颉开发语言中的全局弹窗
  • LED-Merging: 无需训练的模型合并框架,兼顾LLM安全和性能!!