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

力扣347:前K个高频元素

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

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

题解:

一、思路:

1.我希望将nums中的元素按照它们的出现次数从大到小排序。这样输出排序后的前K个元素就好;

2.如何得知nums中每个元素出现的次数呢?使用map哈希表。unordered_map<int,int>,key为nums中的元素,value为该元素出现的次数;

3.如何排序呢?考虑使用顶堆。大顶堆还是小顶堆呢?应该使用小顶堆。小顶堆中只维护K个元素,当新来的元素比队尾的元素还大时,弹出队头的元素,在队尾放入新的元素;

4.最后输出小顶堆中所有的key。

二、代码实现:

1.创建哈希表:

unordered_map<int, int> map;
for (int i = 0; i < nums.size(); i++) {map[nums[i]]++;
}

说明:map[nums[i]]++这句会执行将key为nums[i]的value进行++操作。如果没有nums[i]的key,则会先创建一个<nums[i],0>,再对value进行++操作;

2.创建小顶堆:

priority_queue<pair<int, int>, vector<pair<int, int>>, mycompare> pri_que;
for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {pri_que.push(*it);if (pri_que.size > k) pri_que.pop();
}

说明:

(1)

priority_queue<pair<int, int>, vector<pair<int, int>>, mycompare> pri_que;

以上代码中:pair<int,int>为pri_que中的数据类型;vector<pair<int,int>>为pri_que的底层数据结构;mycompare为pri_que的比较器类。由于是小顶堆,mycompare比较器类定义如下:

class mycompare {
public:bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {return lhs.second > rhs.second;}
};

(2)

for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {pri_que.push(*it);if (pri_que.size > k) pri_que.pop();
}

unordered_map<int,int>::iterator it = map.begin()意味创建迭代器it作为循环变量;

3.取出顶堆中所有的元素:

vector<int>result;
for (int i = k - 1; i >= 0; i--) {result.push_back(pri_que.top().first);pri_que.pop();
}
return result;

完成代码:

class Solution {class mycompare {public:bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {return lhs.second > rhs.second;}};
public:vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int, int> map;for (int i = 0; i < nums.size(); i++) {map[nums[i]]++;}priority_queue<pair<int, int>, vector<pair<int, int>>, mycompare> pri_que;for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {pri_que.push(*it);if (pri_que.size > k) pri_que.pop();}vector<int>result;for (int i = k - 1; i >= 0; i--) {result.push_back(pri_que.top().first);pri_que.pop();}return result;}
};

http://www.xdnf.cn/news/1981.html

相关文章:

  • 文章记单词 | 第43篇(六级)
  • Kafka和flume整合
  • cJSON中#define cJSON_IsReference 256 和 #define cJSON_StringIsConst 512这定义的大小是?
  • CSS常见布局
  • 逐行解析性能奥秘:借助 `line_profiler` 深入优化热点函数
  • MySQL 从入门到精通:第二篇 - 数据类型、约束与索引
  • 【华为HCIP | 华为数通工程师】821—多选解析—第十六页
  • 那些年踩过的坑之Arrays.asList
  • CC攻击的类型都有哪些?
  • eclipse怎么导入junit4
  • 解读《数据资产质量评估实施规则》:企业数据资产认证落地的关键指南
  • MCP(Model Context Protocol)
  • AlarmClock4.8.4(官方版)桌面时钟工具软件下载安装教程
  • Zephyr kernel Build System (CMake)介绍
  • MySQL引擎分类与选择、SQL更新底层实现、分库分表、读写分离、主从复制 - 面试实战
  • 数字浪潮下的算力担当:GPU 服务器的多元应用、核心价值
  • 技术探索之路:从自我认知到成长规划
  • 实现层归一化
  • 数据结构------C语言经典题目(7)
  • 【T-MRMSM】文本引导多层次交互多尺度空间记忆融合多模态情感分析
  • 基于cesium实现鼠标移动动态绘制矩形和圆
  • Rust 学习笔记:函数和控制流
  • React 中什么时候用事件总线
  • 微信小程序直传阿里云 OSS 实践指南(V4 签名 · 秒传支持 · 高性能封装)
  • ROS1、ROS2如何把预编译好的二进制文件封装成功能包?
  • 【Django】新增字段后兼容旧接口 This field is required
  • 代码随想录:数组
  • 如何实现Android屏幕和音频采集并启动RTSP服务?
  • 如何使用@KafkaListener实现从nacos中动态获取监听的topic
  • 【Hive入门】Hive数据导出完全指南:从HDFS到本地文件系统的专业实践