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

LeetCode:347. 前 K 个高频元素

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

这道题第一眼,是典型的topK问题,第一想法就是堆,所以选择先用哈希表记录每个数出现的次数,再放进堆里找前K个

struct cmp{ bool operator()(pair<int,int>a,pair<int,int>b){ return a.second<b.second; } }; class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int,int>ump; vector<int>ans; for(auto c:nums){ ump[c]++; } priority_queue<pair<int,int>,vector<pair<int,int>>,cmp>q; for(auto c:ump){ q.push(c); } while(k--){ ans.push_back(q.top().first); q.pop(); } return ans; } };

这是我写的第一版代码,时间复杂度是nlogn,首先要手写比较器,增加代码的复杂度,而且建堆和维护都可以优化,从而优化时间复杂度

class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int,int>ump; vector<int>ans; for(auto c:nums){ ump[c]++; } priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q; for(auto [key,value]:ump){ q.push({value,key}); if(q.size()>k)q.pop(); } while(!q.empty()){ ans.push_back(q.top().second); q.pop(); } return ans; } };

这是第二版代码,只维护一个小跟堆,并且只维护K的大小的堆,少了很多维护堆的消耗,也让时间复杂度优化到nlogk

class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int,int>ump; int max_cnt=0; for(auto c:nums){ ump[c]++; max_cnt=max(max_cnt,ump[c]); } vector<vector<int>>bucket(max_cnt+1); for(auto [x,c]:ump){ bucket[c].push_back(x); } vector<int>ans; for(int i=max_cnt;ans.size()<k;i--){ ans.insert(ans.end(),bucket[i].begin(),bucket[i].end()); } return ans; } };

最后这个代码是使用桶排序,通过出现次数来分桶,相同出现次数会被分到一个桶,当ans.size()等于k的时候就会跳出结束,桶排序将时间复杂度降低到n,是这道题的最优解

http://www.gsyq.cn/news/1605372.html

相关文章:

  • M3DM 总览:三大模块的数据流
  • 应用场景与方案优势
  • 智慧安防行业物联网技术与方案指南:从监控到应急响应的全方位解决方案
  • 无需备份即可从 iPhone 恢复已删除短信的 4 种方法
  • Android 开发问题:Invalid <color> for given resource value.
  • Shopify分销系统搭建指南:适合初创团队的低成本增长方案
  • Codex Agent Legion 实现原理与 GitHub 使用指南
  • Rust的async函数中的await点优化与编译器在状态机生成中的转换
  • 墨香情手游全域自由轻功,无束缚飞檐走壁闯江湖
  • 一篇搞懂SpringMVC XML 配置标签<context:component-scan>
  • Skill用得好,下班走得早:一文讲透Skill的结构与设计
  • Win11Debloat终极指南:4步快速清理Windows系统,性能提升70%
  • 私域直播SaaS大乱斗:小鹅通、微赞、有赞、悦邻,到底谁更适合“卖菜”的?
  • 第11章:对话管理与会话持久化
  • 162.乐理进阶:和声大调与旋律大调的实战应用与听觉辨识
  • 5分钟免费实现VR视频转2D播放的终极方案
  • MSPM0 DEBUGSS调试子系统:从SWD接口到功耗分析与安全控制
  • 海洋定点长期流速观测该选用哪款单点海流计?偶信告诉你答案
  • AI大模型就业:实践笔记 93
  • Java毕业设计-基于 Web 的网络域名管理系统的设计与实现 基于 Web 架构的域名信息管理系统设计与开发(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 【排故】Linux 镜像恢复 VNC 黑屏卡死:NFS 开机挂载阻塞故障完整排障
  • all-MiniLM-L6-v2 完整详解
  • 【单片机毕业设计】基于 STM32 的老人健康运动监测装置设计,基于 STM32 的人体体征与跌倒报警设备开发(013301)
  • 社评:筑牢思想主权之基,开启文明认知跃迁——论“贾子理论大厦”在人工智能时代的范式革命与时代价值
  • 解锁高阶对话力:ChatGPT角色扮演提示词的5层结构化设计方法(附可立即复用的模板库)
  • 高效获取网盘真实下载地址:LinkSwift直链解析工具深度解析
  • SpiderFoot开源情报工具:自动化OSINT侦察框架部署与实战指南
  • rsync 和 scp 到底有啥区别?一次性看懂
  • Java毕设项目:基于 SpringBoot+Vue 的前后端分离博客系统设计与实现 现代化轻量化个人博客平台 (源码+文档,讲解、调试运行,定制等)
  • 环境准备1. Python 环境