一,题目描述
给定一个数组,求这个数组中第K大的数字。示例如下:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
二, 思路
可以使用快排的思想解决这个问题,因为每次快排之后都会有一个数字归位。而且快排采用分治的策略,查找速度很快。
所以可以利用快排之后数字的下标和第几大K进行对比,如果等于就是找到了,如果小于,说明在快排的右半边,大于在左半边,从而找到正确的数字。
这里需要转变一下的是需要将第几大转化成第几小,因为数组是从小到大排序的,所以需要转换一下。
三,实现
class Solution {
public:
int position(vector<int>& nums, int left, int right)//快排的关键
{
int tmp = nums[left];
while(left < right)
{
while(left < right && nums[right] > tmp)
{
right--;
}
if(left < right)
{
nums[left] = nums[right];
}
while(left < right && nums[left] <= tmp)
{
left++;
}
if(left < right)
{
nums[right] = nums[left];
}
}
nums[left] = tmp;
return left;
}
int randposition(vector<int>& nums, int left, int right)
{
int tmp = rand() % (right - left + 1) + left;
swap(nums[left], nums[right]);
return position(nums, left, right);
}
int quicksort(vector<int>& nums, int left, int right, int k)//找第K大
{
int pos = randposition(nums, left, right);
int j = pos + 1;
if(j == k)
{
return nums[pos];
}
else
{
return j < k ? quicksort(nums, pos+1, right, k) : quicksort(nums,left,pos-1,k);
}
}
int findKthLargest(vector<int>& nums, int k) {
srand(time(0));
return quicksort(nums, 0, nums.size()-1, nums.size()-k+1);
}
};