LintCode-第k大元素

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

您在真实的面试中是否遇到过这个题? 
Yes
例子

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

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

注意

你能够交换数组中的元素的位置

挑战

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

标签  Expand  

相关题目  Expand 


分析:利用快排的思想。不断partition,

代码:

class Solution {
public:
    /*
     * param k : description of k
     * param nums : description of array and index 0 ~ n-1
     * return: description of return
     */
    int kthLargestElement(int k, vector<int> nums) {
        // write your code here
        return findKthLargestElement(k,nums,0,nums.size()-1);
    }
    int findKthLargestElement(int k,vector<int>& nums,int start,int end)
    {
        if(start==end)
            return nums[start];
        int index = partition(nums,start,end);
        if(end-index+1==k)
            return nums[index];
        else if(end-index+1>k)
            return findKthLargestElement(k,nums,index+1,end);
        else
            return findKthLargestElement(k-(end-index+1),nums,start,index-1);
    }
    int partition(vector<int>&nums,int start,int end)
    {
        int x =  (start+end)/2;
        swap(nums[start],nums[x]);
        int i = start+1;
        int j = i;
        while(i<=end&&j<=end)
        {
            if(nums[j]<nums[start])
            {
                swap(nums[i],nums[j]);
                i++;
            }
            j++;
        }
        swap(nums[start],nums[i-1]);
        return i-1;
    }
};


转载于:https://www.cnblogs.com/yangykaifa/p/7007226.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值