跳转至

215.数组中的第 K 个最大元素 (Medium)*

题目描述*

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例*

输入: [3,2,1,5,6,4] 和 k = 2

输出: 5

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4

输出: 4

代码*

可以用快排,快一点用堆排,维护一个 k 的元素的小顶堆,当个数大于 k 时,移除堆顶元素。还可以使用快速选择,只确定目标位置元素即可。

class Solution {
public:
    // 日常复习快排
    void quickSort(vector<int>& nums, int l, int r) {
        int pos = 0;
        if(l < r) {
            int pivot = nums[l];
            int i = l, j = r;
            while(i < j) {
                while(i < j && nums[j] >= pivot) {
                    j--;
                }
                if(i < j) {
                    nums[i] = nums[j];
                    i++;
                }
                while(i < j && nums[i] <= pivot) {
                    i++;
                }
                if(i < j) {
                    nums[j] = nums[i];
                    j--;
                }
                nums[i] = pivot;
            }
            quickSort(nums, l, i - 1);
            quickSort(nums, i + 1, r);
        }
    }   
    int findKthLargest(vector<int>& nums, int k) {
        quickSort(nums, 0, nums.size() - 1);
        return nums[nums.size() - k];
    }
};
class Solution {
public:
    // 快排 8 太适合这个问题,用堆排
    int heapSort(vector<int>& nums, int k) {
        priority_queue<int, vector<int>, greater<int>> res;
        for(int i = 0; i < nums.size(); i++) {
            res.push(nums[i]);
            if(res.size() > k) {
                res.pop();
            }
        }
        return res.top();
    }
    int findKthLargest(vector<int>& nums, int k) {
        quickSort(nums, 0, nums.size() - 1);
        return nums[nums.size() - k];
    }
};
class Solution {
private:
    int target;
    int n;
public:
    int findKthLargest(vector<int>& nums, int k) {
        n = nums.size();
        target = n - k;
        quickSort(nums, 0, n - 1);
        return nums[target];
    }
    void quickSort(vector<int>& nums, int l, int r) {
        if(l > r) {
            return;
        }
        swap(nums[l], nums[l + rand() % (r - l + 1)]);
        int finalPos = l + 1;
        for(int i = l + 1; i <= r; i++) {
            if(nums[i] < nums[l]) {
                swap(nums[i], nums[finalPos++]);
            }
        }
        swap(nums[l], nums[--finalPos]);
        if(finalPos == target) {
            return;
        }else if(finalPos > target) {
            quickSort(nums, l, finalPos - 1);
        }else {
            quickSort(nums, finalPos + 1, r);
        }
    }
};

最后更新: July 23, 2022