LintCode-第k大元素

来源:互联网 发布:软件求职自我介绍 编辑:程序博客网 时间:2024/04/30 06:37

在数组中找到第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;    }};


0 0