【leetcode】215. 數組中的第K個最大元素(kth-largest-element-in-an-array)(分治)[中等]

鏈接

https://leetcode-cn.com/problems/kth-largest-element-in-an-array/

耗時

解題:30 min
題解:18 min

題意

在數組中找到第 k 大的元素。

思路

快排的思想。

將第一個數作爲基準數,將比基準數大的放在基準數的前面,將比基準數小的放在基準數的後面。然後看 k 是在基準數的前面還是後面,或者正好在基準數的位置。如果正好在基準數的位置,則已經得到了第 k 大元素,直接輸出;如果是在基準數的前面或者後面,則縮小範圍至基準數的前面或者後面,繼續上述操作直至 k 正好是基準數的位置或者等縮小範圍至範圍內僅有一個元素。

最壞情況下是 O(n2)O(n^2),期望是 O(n)O(n)

AC代碼

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