一、题目
题目描述
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
示例1
输入
[1,3,5,2,2],5,3
返回值
2
二、思路
1、快速排序的思路
2、在快排的基础上加上终止条件,判断一次排完后k的值与两个指针相遇那个点的大小,如果k大,则说明那个点的左右两边都需要再排序;如果相等直接返回数组索引的那个值;如果k小,则说明只需要对右边部分排序;如果这样都没有找到一个相等的,则整个数组排序完后再返回
三、代码
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int size=nums.size();
return QSort(nums,k,0,size-1);
}
int QSort(vector<int>& nums, int &k,int left,int right){
if(left>=right){
return nums[left];
}
int l=left,r=right;
int x=nums[left];
while(l<r){
while(l<r && nums[r]<=x){
r--;
}
if(l<r && nums[r]>x){
nums[l++]=nums[r];
nums[r]=x;
}
while(l<r && nums[l]>=x){
l++;
}
if(l<r && nums[l]<x){
nums[r--]=nums[l];
nums[l]=x;
}
}
if(r==k-1){
return nums[r];
}
else if(r<k-1){
return QSort(nums,k,r+1,right);
}
else{
return QSort(nums,k,left,r-1);
}
}
};