[LintCode]5.第k大元素

来源:互联网 发布:淘宝店升级天猫店 编辑:程序博客网 时间:2024/04/30 07:47

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

 注意事项

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

样例

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

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

思路:基于快速排序,找到一个轴点,左边的比他大,右边的比他小

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) {         return quickSort(k,nums,0,nums.size()-1);      }    //对从left到right的元素进行从大到小的排序    int quickSort(int k,vector<int> nums,int left,int right){        int i = left, j = right;        int temp= nums[i];        while(i<j){      //下面这个循环完成了一趟排序,将数组中小于temp的元素放在右边,大于的放左边            while(i<j && nums[j]<=temp) j--;//从右往左扫描找到一个大于temp的元素            if(i<j){                nums[i]=nums[j];//放在temp左边                i++;//i指针右移一位            }            while(i<j && nums[i]>temp) i++;//从左往右扫描找到一个小于temp的元素            if(i<j){                nums[j]=nums[i];//放在temp右边                j--;//j指针左移一位            }        }        //nums[i]=temp;//将temp指针放在最终位置        if(i == k -1){            return temp;        }else if(i< k-1){            return quickSort(k,nums,i+1,right);//递归的对temp右边的元素进行排序        }else{            return quickSort(k,nums,left,i-1);//递归的对temp左边的元素进行排序        }    }   };