Day 20 347. 前 K 个高频元素

347. 前 K 个高频元素

题目

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/
作者
chaggle
发布于
2021年9月29日
许可协议