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

力扣347:前K个高频元素

力扣347:前K个高频元素

  • 题目
  • 思路
  • 代码

题目

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

思路

首先我们想到使用哈希表来存储每个元素的出现的次数,其次要对出现的次数进行比较很容易就能想到各种各样的排序方法,但是使用排序方法的话只要出现数组里的元素一多就有可能达到O(N)的时间复杂度。毕竟我们只要前K个高频元素,那么我们是否可以使用堆呢也就是小顶堆,小顶堆又完成了排序的工作又可以只保留前K个元素即设置堆的容量为K。
有了思路就很好写了,我们可以手撕一个小顶堆也可以使用优先队列来完成因为优先队列就是由大小顶堆为底层的。

代码

class Solution {
public://小顶堆// >号为小顶堆 <号为大顶堆static bool cmp(pair<int, int> m, pair<int, int> n) {return m.second > n.second;}vector<int> topKFrequent(vector<int>& nums, int k) {//哈希表unordered_map<int, int> mp;// 小顶堆priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);//统计并存储各元素的出现次数for (auto& ch : nums) {mp[ch]++;}for (auto& [num, count] : mp) {//如果优先队列的大小等于k了我们就需要判断//当前值出现次数和堆顶出现次数if (q.size() == k) {// 如果堆顶的出现次数小于当前出现次数// 说明我们需要pop一个再将当前值插入了if (q.top().second < count) {q.pop();q.emplace(num, count);}} else {//如果小于k那就直接插入q.emplace(num, count);}}vector<int> res;while(!q.empty()){res.push_back(q.top().first);q.pop();}return res;}
};
http://www.dtcms.com/a/286315.html

相关文章:

  • 科技照亮童心|激光院与跳伞塔社区开展公益活动
  • Day24| 93.复原IP地址、78.子集、90.子集II
  • NIO简单介绍和运用
  • MySQL计数函数count原理分析
  • 深入理解Linux文件I/O:系统调用与标志位应用
  • 区块链加密技术全景解析
  • 高效VLP蛋白表达|病毒样颗粒生产|疫苗研发平台
  • 【无标题】标准模型粒子行为与11维拓扑量子色动力学模型严格对应的全面论述
  • 文献分享0719
  • MyBatis:配置文件完成增删改查_添加
  • 智慧后厨检测算法构建智能厨房防护网
  • 零基础入门:用按键精灵实现视频自动操作(附完整脚本)
  • C语言:数组
  • MySQL的关键日志
  • 洛谷 P1395 会议
  • Logback 配置的利器:深入理解<property>与<variable>
  • 教育行业网络升级最佳实践:SD-WAN、传统方案与混合方案对比分析
  • Android sdk 升级 34到35
  • SpringBoot中解决SpringApplication入口和其他Bean不在同属目录下的问题。
  • 暑期自学嵌入式——Day05补充(C语言阶段)
  • STM32+w5500+TcpClient学习笔记
  • 前端基础之《Vue(23)—跨域问题》
  • Effective Modern C++ 条款14:如果函数不抛出异常请使用noexcept
  • 如何将本地Git仓库推送到远程仓库的一个文件中并保留Commit记录
  • 对于编码电机-520直流减速电机
  • 硬核电子工程:从硅片到系统的全栈实战指南—— 融合电路理论、嵌入式开发与PCB设计的工程艺术
  • 正则表达式完全指南:从入门到实战
  • Web3加密货币交易:您需要知道的所有信息
  • 五分钟掌握 TDengine 数据文件的工作原理
  • 《设计模式之禅》笔记摘录 - 8.命令模式