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);}};
