资讯详情

资讯详情

leetcode 347前k个高频元素

class Solution { public: // 按出现次数构造小顶堆 static bool cmp(pairint,int m, pairint,int n) { return m.second n.second; } vectorint topKFrequent(vectorint nums, int k) { // 统计数字 - 出现次数 unordered_mapint,int orders; for (auto v : nums) { orders[v]; } // 创建自定义小顶堆 priority_queue pairint,int, vectorpairint,int, decltype(cmp) q(cmp); // 维护出现次数最大的 k 个元素 for (auto [num, count] : orders) { if (q.size() k) { // 新元素频率更大替换堆顶 if (q.top().second count) { q.pop(); q.emplace(num, count); } } else { // 堆未满直接加入 q.emplace(num, count); } } // 取出堆中的数字 vectorint res; while (!q.empty()) { res.push_back(q.top().first); q.pop(); } return res; } };总结这题分为三步① 哈希表统计频率orders[v];得到数字 → 出现次数② 小顶堆维护前 K 个高频元素cmp保证q.top()始终是当前堆中出现次数最少的元素。堆满以后如果q.top().second count说明新元素频率更高就q.pop(); // 淘汰当前最小频率 q.emplace(num, count); // 加入新元素③ 最终堆中剩下的就是前 K 个高频元素。复杂度统计频率是O(n)维护堆约为O(n log k)整体O(n log k)堆的大小始终不超过k。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →