[C++]Leetcode347.前 K 个高频元素 (详解)

该篇博客详细介绍了如何使用哈希表和桶排序算法解决LeetCode上的347题——找出数组中出现频率前k高的元素。首先,通过哈希表计算每个元素的频率并找出最大频率;然后,使用桶存储相同频率的元素;最后,从最大频率开始,依次将元素添加到结果容器中,直至容器大小等于k。博客还提供了C++实现的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

347.前 K 个高频元素

题目:给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

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

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

思路:
建立哈希表取出最大频率,建立桶存入对应频率的所有元素,从最大频率开始倒序遍历。

1.构建哈希表来存放对应元素的频率,并求出最大频率

2.定义一个桶,遍历哈希表,存入对应频率的元素值。

3.定义一个结果容器ans,从最大频率开始遍历。找到对应频率的元素插入ans

4.若ans的大小为k,满足了题目要求,返回

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) 
    {
        //建立一个哈希表来存放元素和其对应的频率
        unordered_map<int, int> count;
        int max_freq = 1;
        for(const int n:nums) 
        {
            //取出当前元素的最大频率
            max_freq = max(max_freq, ++count[n]);
        }
        //利用哈希表建立一个桶
        unordered_map<int, vector<int>> buckets;
        for(const auto& k:count) 
        {
            //遍历哈希表,桶中存入同一频率对应的元素
	   // k.second为对应的频率  k.first为对应频率的元素
            buckets[k.second].push_back(k.first);
        }
        vector<int> ans;//构建一个vector存放最终结果
        //从最大频率开始逐次往下遍历
        for(int i = max_freq; i>= 1; i--)
        {
            //找到对应频率的向量(向量中存放的是对应频率的元素)
            auto it = buckets.find(i);
            //如果没有则跳出本次循环,不执行后面语句,进行下一次循环
            if( it == buckets.end()) continue;
            //插入当前频率的元素
            ans.insert(ans.end(),it->second.begin(), it->second.end());
            //如果ans大小等于k,满足了题目条件,返回
            if(ans.size() == k) return ans;
        }
        return ans;
    }
};

[[C++]Leetcode超高效刷题顺序及题目详解笔记(持续更新中)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值