力扣HOT100之堆:347. 前 K 个高频元素

这道题如果不要求时间复杂度的话其实随便怎么做都行,但是这里有个时间复杂度的限制,还是要好好想想怎么做耗时最短。看了一下灵神的题解,我觉得他提到的桶排序方法还是很通俗易懂的。下面讲一下主要的思路。

我们首先定义一个哈希表,为了保证插入操作的耗时不会过长,这里我们使用unordered_map来实现,我们先遍历数组nums,统计每个元素出现的频次,将键值对存储在hash中,然后我们定义一个二维数组buckets,其中每一个一维数组中存放的元素出现频次相同,我们定义:在nums出现了i次的元素将存入buckets[i]中,我们遍历一遍哈希表,将对应的元素添加到对应的桶子里,最后,我们从后向前遍历buckets,如果遇到长度不为0的一维数组(桶子),则将桶中的所有元素添加到结果result中,并同时将k减去桶中的元素个数,当k <= 0时,说明已经查找完毕,我们直接结束遍历,将result返回即可。

cpp 复制代码
class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> hash;  //用于存放数组元素和对应的出现频次
        vector<vector<int>> buckets(nums.size() + 1);   //其中的每一个一维数组用于存放出现频次相同的元素
        vector<int> result;  //用于存储结果
        //统计各个元素的出现频次
        for(int& i : nums)
            hash[i]++;
        //将出现次数相同的元素放到同一个桶中
        for(auto& i : hash)
            buckets[i.second].emplace_back(i.first);
        for(int i = buckets.size() - 1; i > 0; i--){
            if(!buckets[i].empty()){
                result.insert(result.end(), buckets[i].begin(), buckets[i].end());
                k -= buckets[i].size();
                if(k <= 0) break;  //收集完毕,直接退出循环
            }
        }
        return result;
    }
};
相关推荐
麦麦麦造1 分钟前
DeepSeek突然发布 V3.2-exp,长文本能力加强,价格进一步下探
算法
lingran__1 小时前
速通ACM省铜第十七天 赋源码(Racing)
c++·算法
MobotStone2 小时前
手把手教你玩转AI绘图
算法
CappuccinoRose2 小时前
MATLAB学习文档(二十二)
学习·算法·matlab
学c语言的枫子3 小时前
数据结构——基本查找算法
算法
yanqiaofanhua3 小时前
C语言自学--自定义类型:结构体
c语言·开发语言·算法
sali-tec3 小时前
C# 基于halcon的视觉工作流-章39-OCR识别
开发语言·图像处理·算法·计算机视觉·c#·ocr
芒克芒克3 小时前
LeetCode 面试经典 150 题之判断子序列解题详解
算法
兮山与4 小时前
算法1.0
算法
im_AMBER5 小时前
数据结构 02 线性表
数据结构·算法