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

力扣HOT100之堆:347. 前 K 个高频元素


这道题如果不要求时间复杂度的话其实随便怎么做都行,但是这里有个时间复杂度的限制,还是要好好想想怎么做耗时最短。看了一下灵神的题解,我觉得他提到的桶排序方法还是很通俗易懂的。下面讲一下主要的思路。
我们首先定义一个哈希表,为了保证插入操作的耗时不会过长,这里我们使用unordered_map来实现,我们先遍历数组nums,统计每个元素出现的频次,将键值对存储在hash中,然后我们定义一个二维数组buckets,其中每一个一维数组中存放的元素出现频次相同,我们定义:在nums出现了i次的元素将存入buckets[i]中,我们遍历一遍哈希表,将对应的元素添加到对应的桶子里,最后,我们从后向前遍历buckets,如果遇到长度不为0的一维数组(桶子),则将桶中的所有元素添加到结果result中,并同时将k减去桶中的元素个数,当k <= 0时,说明已经查找完毕,我们直接结束遍历,将result返回即可。

class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int, int> hash;  //用于存放数组元素和对应的出现频次vector<vector<int>> buckets(nums.size() + 1);   //其中的每一个一维数组用于存放出现频次相同的元素vector<int> result;  //用于存储结果//统计各个元素的出现频次for(int& i : nums)hash[i]++;//将出现次数相同的元素放到同一个桶中for(auto& i : hash)buckets[i.second].emplace_back(i.first);for(int i = buckets.size() - 1; i > 0; i--){if(!buckets[i].empty()){result.insert(result.end(), buckets[i].begin(), buckets[i].end());k -= buckets[i].size();if(k <= 0) break;  //收集完毕,直接退出循环}}return result;}
};

相关文章:

  • TDengine 快速体验(云服务方式)
  • 对3D对象进行形变分析
  • 3D扫描技术赋能汽车零部件尺寸测量效率提升
  • win11本地Docker部署腾讯云Docker部署若依前后端分离版
  • 关于前端常用的部分公共方法(三)
  • Spring boot应用监控集成
  • 基于算法竞赛的c++编程(28)结构体的进阶应用
  • 渗透靶场PortSwigger Labs指南:规范链接的反射XSS
  • JavaScript 核心对象深度解析:Math、Date 与 String
  • CPP基础(2)
  • 在多云环境透析连接ngx_stream_proxy_protocol_vendor_module
  • 最新SpringBoot+SpringCloud+Nacos微服务框架分享
  • 72道Nginx高频题整理(附答案背诵版)
  • Vue.js教学第二十二章:vue实战项目商城项目
  • 实现安全、经济、节约、环保的智慧交通开源了
  • ceph集群调整pg数量实战(下)
  • Minktec 柔性弯曲传感器应用:3D 脊柱姿势追踪与人体活动识别
  • 股指期货的基差怎么衡量贴水率?
  • OpenLayers 获取地图状态
  • css~word-break属性
  • wordpress相关文章tag/洛阳seo博客
  • 化州市住房和城乡建设局网站/百度关键词工具在哪里
  • 网站建设公司 知乎/建网站的软件
  • 杭州seo网站推广/提升seo排名
  • 崇安区网站建设价格/网站在线客服系统免费
  • wordpress付费查看/seo页面内容优化