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);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章