215.Kth Largest Element in an Array

思路:

分治法,其实思路跟动态规划基本一样,只不过用递归的方式去解决问题。

总结分治法的框架就是: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;
        }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值