本文共 865 字,大约阅读时间需要 2 分钟。

说下思路:首先选第一个数作为pviot,然后通过一趟快排操作将他放到正确位置,如果此时他正好是距离右端点的第k个数,那么这个就是第k大的数,如果他距离右端点的记录大于k,则说明,要找的数在这个点右边,如果距离小于k,说明要去左边找k-(end-left+1)个数。
class Solution {public:    int findKthLargest(vector       & nums, int k) {        int n = nums.size();        helper(nums,0,n-1,k);        return nums[n-k];    }    void helper(vector         & nums, int start, int end, int k){        if(start>=end) return;        int key = nums[start], left = start, right = end;        while(left           =key) right--;            swap(nums[left],nums[right]);            while(left             <=key) left++;            swap(nums[left],nums[right]);        }        if(end-left+1==k) return;        else if(end-left+1>k) helper(nums,left+1,end,k);        else helper(nums,start,left-1,k-(end-left+1));    }};                       这个算法的时间复杂度是O(n)的,为什么,因为这个递归的过程近似于只需要常数次操作,就能找到答案。所以时间复杂度是O(n)
转载地址:http://ojqv.baihongyu.com/