lintcode5-5. 第k大元素

在数组中找到第k大的元素

 注意事项

你可以交换数组中的元素的位置

样例

给出数组 [9,3,2,4,8],第三大的元素是 4

给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推

挑战 

要求时间复杂度为O(n),空间复杂度为O(1)

思想利用分治法进行处理:使用快速排序,和快速排序不同的是每次分为两个部分时仅需要考虑其中一个部分,这样就会使得时间复杂度由O(nlogn)降为O(n),这里我并没有使用迭代的写法,因为使用迭代时,数据量很大时内存会不够用。

class Solution {
public:
    /*
     * @param n: An integer
     * @param nums: An array
     * @return: the Kth largest element
     */
     //快速排序
    int quickSort(vector<int> &nums,int begin,int end){

         int key=nums[begin];
         int first=begin,last=end;
         
         while(first<last){
             while(nums[last]>=key&&first<last){
                last--;
             }
                 nums[first]=nums[last];

             while(nums[first]<=key&&first<last){
                first++;
             }
                 nums[last]=nums[first];

         }
         nums[first]=key;
         return first;
     }
     
    int kthLargestElement(int n, vector<int> &nums) {
        // write your code here
        int length=nums.size();
        int begin=0,end=length-1;
        
        int flag1=quickSort(nums,begin,end);
        while(1){
            for(int i=0;i<length;i++)
                cout<<nums[i]<<"  ";
            cout<<endl;
            if(length-flag1>n){
                begin=flag1+1;
                flag1=quickSort(nums,begin,end);
            }
            else if(length-flag1<n){
                end=flag1-1;
                flag1=quickSort(nums,begin,end);
            }
            else 
                break;
        }
            
        for(int i=0;i<length;i++)
            cout<<nums[i]<<"  ";
        return nums[length-n];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值