题目描述:
在未排序的数组中找到第 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); }