思路:
分治法,其实思路跟动态规划基本一样,只不过用递归的方式去解决问题。
总结分治法的框架就是:solve函数(相当于动态规划的状态划分函数,这个比较关键,找到了,问题基本就解决了)+递归使用(相当于动态规划的递推关系)。
本题的solve函数是一遍快排。
class Solution {
public://递归的使用一遍快排,直到前面的的数刚好凑够k个。
int solve(vector<int>::iterator iter,int len,int k){
if(len==1) return *iter;
int counter=0;
int key=*iter;
int low=0,high=len-1;
while(low<high){
while(low<high && *(iter+high)<key){
high--;
}
*(iter+low)=*(iter+high);
while(low<high && *(iter+low)>=key){
low++;
}
*(iter+high)=*(iter+low);
}
*(iter+low)=key;
if(low==k-1)
return key;
else if(low>k-1){
solve(iter,low,k);
}else{
solve(iter+low+1,len-low-1,k-low-1);
}
}
//接口函数
int findKthLargest(vector<int>& nums, int k) {
int len=nums.size();
if(k<1 || k>len) return -1;
int result=solve(nums.begin(),len,k);
return result;
}
};