基于快排的top k
class Solution
{
public:
void qsort(vector<int>& v, int start, int end, vector<int>& ret, int k) {
int picked = rand() % (end - start + 1) + start;
swap(v[picked], v[start]);
int pivot = v[start];
int index = start;
for (int i = start + 1; i <= end; i++) {
if (v[i] >= pivot) {
swap(v[index + 1], v[i]);
index++;
}
}
swap(v[start], v[index]);
if (k <= index - start) {
qsort(v, start, index - 1, ret, k);
}
else {
for (int i = start; i <= index; i++) {
ret.push_back(v[i]);
}
if (k > index - start + 1) {
qsort(v, index + 1, end, ret, k - (index - start + 1));
}
}
}
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> ret;
qsort(nums, 0, nums.size() - 1, ret, k);
return ret;
}
};
基于堆的top k
class Solution
{
public:
void TopK_Heap(vector<int>& arr, int k)
{
if (arr.size() <= k)
return;
vector<int> box;
box.resize(k);
for (int i = 0; i < k; i++)
box[i] = arr[i];
for (int i = box.size() / 2; i >= 0; i--)
HeapAdjust(box, i);
for (int i = k; i < arr.size(); i++)
{
if (arr[i] > box[0])
{
box[0] = arr[i];
HeapAdjust(box, 0);
}
}
for (int i = 0; i < box.size(); i++)
cout << box[i] << endl;
}
private:
void HeapAdjust(vector<int>& nums, int pos)
{
for (int i = 2 * pos + 1; i < nums.size(); i = 2 * i + 1)
{
if (i<nums.size() - 1 && nums[i]>nums[i + 1])
i++;
if (nums[i] >= nums[pos])
break;
swap(nums[i], nums[pos]);
pos = i;
}
}
};