leetcode[215] Kth Largest Element in an Array 解法及代码

题目描述:

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

示例 1:

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

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

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法1:

最偷懒的解法,直接用stl的部分排序(全排序必然超时), 输出第K个元素


#include <algorithm>

int findKthLargest(vector<int>& nums, int k) {
    std::partial_sort(nums.begin(), nums.begin() + k, nums.end(), [](auto& a, auto& b) {
        return a > b;
    });
    return nums[k - 1];
}

这里需要注意的是partial_sort的第三个参数,需要自定义排序规则,默认从小到大,我们需要从大到小。

解法2:

建立一个大顶堆,使用堆排序,排到第K个数时停止并返回,代码:


void percolateDown(vector<int>& nums, int start, int end) {
    for (int j = 2 * start + 1; j <= end; j = 2 * start + 1) {
        if (j < end && nums[j + 1] >= nums[j]) j++;
        if (nums[start] > nums[j]) break;
        int temp = nums[start];
        nums[start] = nums[j];
        nums[j] = temp;
        start = j;
    }
}

void makeHeap(vector<int>& nums) {
    int len = nums.size();
    for (int r = len / 2 - 1; r >= 0; r--) {
        percolateDown(nums, r, len - 1);
    }
}

int heapSort(vector<int>& nums, int k) {
    int n = nums.size() - 1;
    for (int i = 0; i < k; i++) {
        int temp = nums[n];
        nums[n] = nums[0];
        nums[0] = temp;
        n--;
        percolateDown(nums, 0, n);
    }
    return nums[nums.size() - k];
}

int findKthLargest(vector<int>& nums, int k) {
    makeHeap(nums);
    return heapSort(nums, k);
}

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注