LeetCode 347. 前K个高频元素

LeetCode 347. 前K个高频元素

输入一个整数数组和一个整数k,返回其中出现频率前k高的元素。保证答案唯一,不会出现返回元素的个数大于k的情况,可以按任意顺序返回答案。

思路:

  1. 建立哈希表统计每个元素出现的次数

  2. 建立容量为10001的vector表示:出现次数i-出现次数都为i的全部元素[元素1,元素2…];

    vector<vector<int>> topK(10001,vector<int>{});
    
    topK[i.second].push_back(i.first);
    

    与此同时维护出现的最多次数biggest_num,方便返回答案时直接从容器biggest_num的位置向ans压入数据,减少从容器10000位置向前寻找第一个出现次数都为i的全部元素[]不为空的时间

  3. 向ans压入k次数据

c++代码实现

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> hash;
        vector<int> ans;
        int biggest_num=0;
        for(int num:nums)
        {
            hash[num]++;	// 1.建立哈希表统计每个元素出现的次数
        }
        vector<vector<int>> topK(10001,vector<int>{});
        for(auto i:hash)
        {
            topK[i.second].push_back(i.first);	// 2.建立容量为10001的vector记录 出现次数i-出现次数都为i的全部元素[元素1,元素2...]
            biggest_num = max(biggest_num,i.second);	// 2.与此同时维护出现的最多次数biggest_num
        }

        while(k>0)	// 3.向ans压入k次数据
        {
            while(!topK[biggest_num].empty())
            {
                ans.push_back(topK[biggest_num].back());	// 3.直接从容器biggest_num的位置向ans压入数据,减少从容器10000位置向前寻找第一个出现次数都为i的全部元素[]不为空的时间
                k--;
                topK[biggest_num].pop_back();
            }
            biggest_num--;
        }
        return ans;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值