347. 前 K 个高频元素
难度中等653
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
class Solution {
public:
static bool cmp(const pair<int, int>& p1, const pair<int, int>& p2){
return p1.second > p2.second;
}
// class cmp2{
// public:
// bool operator()(const pair<int, int>& p1, const pair<int, int>& p2){
// return p1.second > p2.second;
// }
// };
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> mem;
vector<int> ans;
for(auto& c: nums){
mem[c] ++;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> qs(cmp);
for(auto& [u, v] : mem){
if(qs.size() == k){
qs.emplace(u, v);
qs.pop();
}else{
qs.emplace(u, v);
}
}
while(!qs.empty()){
ans.push_back(qs.top().first);
qs.pop();
}
return ans;
}
};
215. 数组中的第K个最大元素
难度中等1033
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和
k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和
k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
class Solution {
public:
int quick_choose(vector<int>& nums, int l, int r, int k){
if(l == r){
return nums[l];
}
int i = l - 1, j = r + 1;
int mid = nums[l];
while(i < j){
do i ++; while(nums[i] > mid);
do j --; while(nums[j] < mid);
if(i < j) swap(nums[i], nums[j]);
}
int dis = j - l + 1;
if(k <= dis) return quick_choose(nums, l, j, k);
else return quick_choose(nums, j + 1, r, k - dis);
}
int findKthLargest(vector<int>& nums, int k) {
if(!n) return 0;
int n = nums.size();
return quick_choose(nums, 0, n - 1, k);
}
};