lintcode5-5. 第k大元素

来源:互联网 发布:手机开淘宝店怎么装修 编辑:程序博客网 时间:2024/05/22 17:47

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