1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { for(auto num : nums) ++map[num]; vector<int> r; for(auto [num, _] : map) r.push_back(num); sort(r, 0, r.size() - 1, k); return vector<int>(r.begin(), r.begin() + k); } private: unordered_map<int, int> map; int partition(vector<int>& nums, int lo, int hi) { auto pivot = lo + (rand() % (hi - lo + 1)); int i = lo, j = hi + 1; int c = map[nums[pivot]]; swap(nums[pivot], nums[lo]); while(i < j) { while(i < hi && map[nums[++i]] > c) {} while(j > lo && map[nums[--j]] < c) {} if(i >= j) break; swap(nums[i], nums[j]); } swap(nums[lo], nums[j]); return j; } void sort(vector<int>& nums, int lo, int hi, int k) { if(lo >= hi) return; auto j = partition(nums, lo, hi); if(j == k - 1) return; if(j < k - 1) sort(nums, j + 1, hi, k); else sort(nums, lo, j - 1, k); } };
|