leetcode:215. 数组中的第K个最大元素

215. 数组中的第K个最大元素

这里使用的是快速排序的思想,快排是每一次确定一个数的位置,左边的都比它小,右边的都比他大。

但是直接用快排会需要更多的时间,这里相当于对快排进行剪枝,把快排中不需要的步骤去掉

每次确定一个数的位置之后,如果第K个最大元素在左边,则只对左边进行搜索,否则对右边搜索

当然,快排中的其他的优化也可以用在这里,比如取任意三个数中的中数来定位,或者是在搜索空间小于n=5时进行遍历,都可以。

class Solution {
public:
    int find(vector<int>& nums, int k, int r, int l){
        int a = r, b = l;
        int flag = nums[r];
        while(r < l){
            while(r < l&&nums[l] >= flag) l --;
            if(r >= l) break;
            nums[r++] = nums[l];
            //if(k > l||k < r) break;
            while(r < l&&nums[r] <= flag) r ++;
            if(r >= l) break;
            nums[l--] = nums[r];
            //if(k < r||k > l) break;
        }
        if(k < r)
            return find(nums, k, a, r-1);
        else if(k > l)
            return find(nums, k, l+1, b);
        else 
            return flag;
    }
    int findKthLargest(vector<int>& nums, int k) {
        return find(nums, nums.size()-k, 0, nums.size()-1);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章