LeetCode-347-前k个高频元素-中等(红黑树/堆/快排)

一 题目

给你一个整数数组 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){
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值