力扣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;
    }
};
相关推荐
ゞ 正在缓冲99%…40 分钟前
leetcode1312.让字符串成为回文串的最少插入次数
数据结构·算法·leetcode·动态规划·记忆化搜索
七夜zippoe1 小时前
Rust `std::iter` 深度解析:`Iterator` Trait、适配器与性能
开发语言·算法·rust
寂静山林1 小时前
UVa 1464 Traffic Real Time Query System
算法
laocooon5238578861 小时前
寻找使a×b=c成立的最小进制数(2-16进制)
数据结构·算法
YY_TJJ1 小时前
算法题——图论
算法·深度优先·图论
默默的流星雨1 小时前
TARJAN相关
c++·算法·深度优先·图论
JJJJ_iii2 小时前
【机器学习11】决策树进阶、随机森林、XGBoost、模型对比
人工智能·python·神经网络·算法·决策树·随机森林·机器学习
别学LeetCode3 小时前
#leetcode#
leetcode
loong_XL3 小时前
AC自动机算法-字符串搜索算法:敏感词检测
开发语言·算法·c#
Xの哲學4 小时前
Linux Netlink全面解析:从原理到实践
linux·网络·算法·架构·边缘计算