一 题目
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
二 前言
像这种topK问题(前k小/前k大/第k大/第k小)的题解都是套路,基本就是堆排序O(nlogk)、快速选择O(n)【最快】、二叉搜索树O(nlogk)。本题只是在这基础上的变形而已,要处理值和频率对应的问题,所以考虑以哈希表为底层的unordered_map来处理,然后在后面排序的过程中需要注意数据结构的变化。
三 题解
1.两个红黑树反着赋值。
思路:考虑到c++中的map底层是红黑树实现的,会对key值排序,其遍历结果默认为从小到大,因此可以选择用map实现,利用map对频率进行排序,则最后反向迭代器遍历出的前k个数即为题目所求。myMap1用来统计各个数字出现的频率,再反向赋值给myMap2,因为频率相同的数字可能会重复,所以要用容器来装,然后用反向迭代器遍历结果。
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int,int>myMap1;
//因为频率相同的数字可能不止一个,所以要用数组来存
map<int,vector<int>>myMap2;
// 数字对应频率映射
for(int n : nums){