LeetCode:347.前K个高频元素

方法 1:用 vector 存储键值对,按频率排序(简单直接)
cpp 复制代码
class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        // 1. 统计每个元素的频率
        unordered_map<int, int> freq;
        for (int num : nums) {
            freq[num]++;
        }

        // 2. 将键值对存入vector,便于按频率排序
        vector<pair<int, int>> freq_vec(freq.begin(), freq.end());

        // 3. 按频率降序排序(第二个元素是频率)
        sort(freq_vec.begin(), freq_vec.end(), 
            [](const pair<int, int>& a, const pair<int, int>& b) {
                return a.second > b.second; // 频率高的排在前
            });

        // 4. 取前k个元素的键
        vector<int> result;
        for (int i = 0; i < k; ++i) {
            result.push_back(freq_vec[i].first);
        }

        return result;
    }
};
进阶方法 2:用优先队列(堆)优化(时间复杂度 O (n log k))
cpp 复制代码
class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        // 1. 统计频率
        unordered_map<int, int> freq;
        for (int num : nums) {
            freq[num]++;
        }

        // 2. 用小顶堆存储前k个高频元素(堆顶是最小的高频元素)
        // 堆中元素是 (频率, 元素),按频率升序排列
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

        for (auto& pair : freq) {
            pq.push({pair.second, pair.first});
            // 当堆大小超过k,弹出最小的高频元素
            if (pq.size() > k) {
                pq.pop();
            }
        }

        // 3. 从堆中取出结果(此时堆中是前k个高频元素)
        vector<int> result;
        while (!pq.empty()) {
            result.push_back(pq.top().second);
            pq.pop();
        }
        // 由于堆是小顶堆,结果是从小到大的,如需保持高频在前可反转
        reverse(result.begin(), result.end());

        return result;
    }
};

用小顶堆只保留前 k 个高频元素,每次插入后若超过 k 就弹出最小的,效率更高,尤其当 n 很大而 k 较小时。

相关推荐
小龙报几秒前
【C语言进阶数据结构与算法】LeetCode27 && LeetCode88顺序表练习:1.移除元素 2.合并两个有序数组
c语言·开发语言·数据结构·c++·算法·链表·visual studio
炽烈小老头1 分钟前
【每天学习一点算法 2026/01/21】倒二进制位
学习·算法
无限进步_9 分钟前
C语言实现贪吃蛇游戏完整教程【最终版】
c语言·开发语言·c++·git·游戏·github·visual studio
Script kid10 分钟前
Redis(Remote Dictionary Server远程字典服务器)五种常见数据结构及常见用法和指令
服务器·数据结构·redis
辰阳星宇14 分钟前
【工具调用】工具调用后训练参数设计方案总结
人工智能·算法·自然语言处理
范纹杉想快点毕业15 分钟前
C语言查找算法对比分析
数据结构·算法
被星1砸昏头16 分钟前
自定义操作符高级用法
开发语言·c++·算法
2301_8105407317 分钟前
python第一次作业
开发语言·python·算法
Stardep23 分钟前
算法入门19——二分查找算法——X的平方根
算法·leetcode·二分查找算法
We་ct23 分钟前
LeetCode 135. 分发糖果:双向约束下的最小糖果分配方案
前端·算法·leetcode·typescript