215.Kth Largest Element in an Array
2015-06-26 21:12
239 查看
思路:
分治法,其实思路跟动态规划基本一样,只不过用递归的方式去解决问题。
总结分治法的框架就是: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;
}
};
分治法,其实思路跟动态规划基本一样,只不过用递归的方式去解决问题。
总结分治法的框架就是: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;
}
};
相关文章推荐
- Linux-VMware三种网络模式
- qt界面编写流程记录
- 物联网系统的搭建(六)
- 学习3:应用程序基础及组件
- [转载] 运维角度浅谈:MySQL数据库优化
- Linux命令学习总结:date命令
- 学习2:HelloWorld项目目录
- 圆进度条
- 仿微信6.0底部菜单选择和滑动效果
- NGINX引入线程池 性能提升9倍
- OGNL 对象视图导航语言
- Linux启动过程
- 6.14纯虚数的派生类
- java 笔记
- c语言函数回调函数回调
- java学习之旅25--递归算法详解
- searchlight要用elasticsearch解决metadata查询慢的问题
- 委托和匿名委托
- 全面解析C#中的异步编程
- 利用HTML5开发Android笔记(下篇)