本文最后更新于 2025-03-31T00:09:09+08:00
题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 给你一个整数数组 nums 和一个整数 k ,
请你返回其中出现频率前 k 高的元素。
你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1] 提示:
1 <= nums.length <= 105 k 的取值范围是 [1, 数组中不相同的元素的个数] 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。
|
题目思路
- 1、典型的大顶堆问题,可以建立一个无序的unordered_map保存键值对,而后在建立一个priority_queue,因为C++中priority_queue默认是大顶堆的建立,故将unordered_map中的序列对{k,v}序列改为{v,k}即可保存在priority_queue中。然后输出前n个键值对的v值即可。
- 2、进阶版可以手写一个堆替换priority_queue,等以后有时间再来补坑。
代码块。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public: vector<int> topKFrequent(vector<int>& nums, int n) { unordered_map<int, int> up; for(auto i : nums) up[i]++; priority_queue<pair<int, int>> p; for(auto it = up.begin(); it != up.end(); it++) { p.push({it -> second, it -> first}); } vector<int> ans; while(n--) { ans.push_back(p.top().second); p.pop(); } return ans; } };
|
复杂度
时间复杂度:O(nlogn)
空间复杂度:O(n)
Day 20 347. 前 K 个高频元素
https://chaggle.github.io/2021/09/29/Leetcode/91-day/day-20/