215. Kth Largest Element in an Array

来源:互联网 发布:苹果软件破解版 编辑:程序博客网 时间:2024/05/17 03:54

215. Kth Largest Element in an Array


题目原文

Find the kth largest element in an unsorted array. Note that it is the
kth largest element in the sorted order, not the kth distinct element.

For example, Given [3,2,1,5,6,4] and k = 2, return 5.

Note: You may assume k is always valid, 1 ≤ k ≤ array’s length.


思路

利用快排的思想。选择数组中的一个数作为pivot,并对该pivot进行第一趟排序。第一趟排序完成后该pivot位于正确的位置,且其前面的元素均不大于pivot,后面的元素均不小于pivot。判断所求位置与pivot位置的关系。若相等则输出pivot,不相等时可以对pivot前面的元素或者后面的元素再次进行快排的第一趟排序。


代码

class Solution {public:    int f(vector<int>& nums,int begin,int end,int k){        if(begin==end) return nums[begin];        int pivot=nums[begin];        int fast=begin+1;        int slow=begin+1;        while(fast<=end){            if(nums[fast]<pivot){                swap(nums[fast],nums[slow]);                slow++;            }            fast++;        }        swap(nums[begin],nums[slow-1]);        if(slow-1==nums.size()-k) return nums[slow-1];        else if(slow-1<nums.size()-k) return f(nums,slow,end,k);        else return f(nums,begin,slow-2,k);    }    int findKthLargest(vector<int>& nums, int k) {        if(nums.size()==1) return nums[0];        return f(nums,0,nums.size()-1,k);    }};

时间复杂度 T(n)=T(n/2)+O(n)=O(n)

运行时间 62ms


本题排序亦可过。

class Solution {public:    int findKthLargest(vector<int>& nums, int k) {        int len=nums.size();        sort(nums.begin(),nums.end());        return nums[len-k];    }};

时间复杂度 O(nlogn)
运行时间 19ms

0 0
原创粉丝点击