版权声明:by ruohua3kou https://blog.csdn.net/ruohua3kou/article/details/88963223
TopK问题,一般两种解法
1.构建大顶堆
2.利用快排的分治思想
这里采用了第二种方法
关于top-K问题的很详细的解析
class Solution
{
int partition(vector<int> &nums, int low, int high)
{
int l = low + 1, r = high;
int base = nums[low];
while (l <= r)
{
if (nums[l] < base && nums[r] > base)
{
swap(nums[l++], nums[r--]);
}
if (nums[l] >= base)
++l;
if (nums[r] <= base)
--r;
}
swap(nums[low], nums[r]);
return r;
}
public:
int findKthLargest(vector<int> &nums, int k)
{
int low = 0, high = nums.size() - 1;
while (true)
{
int indexBase = partition(nums, low, high);
if (indexBase == k - 1)
return nums[indexBase];
if (indexBase < k - 1)
low = indexBase + 1;
else
high = indexBase - 1;
}
return 0;
}
};