215.数组中的第K个最大元素
一、题目描述
在未排序的数组中找到第 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 ≤ 数组的长度。
二、解法一:暴力
思路:
先将数组排序,之后直接输出第K大的元素。
代码:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int size = int(nums.size());
return nums[size - k];
}
};
三、解法二:基于快速排序的选择方法
思路:
快速排序的基本原理是每次确定一个分界值,将小于分界值的数据集中到数组左侧,大于分界值的数据集中到数组右侧,并按此方法对左右两部分数据进行类似处理。
因此,每经过一次划分,我们就可以确定一个元素的最终位置(即选定的分界值)。若某次选择的分界值,它的位置是倒数第k时,得到答案。
代码:
class Solution {
public:
int Partition(vector<int>& nums, int l, int r)
{
int key = nums[l];
while (l < r)
{
while (l < r&&nums[r] >= key)
r--;
nums[l] = nums[r];
while (l < r&&nums[l] <= key)
l++;
nums[r] = nums[l];
}
nums[l] = key;
return l;
}
int QuickSelect(vector<int>& nums, int l, int r, int target)
{
int pivot = Partition(nums, l, r);
if (pivot == target)
{
return nums[pivot];
}
else if (pivot > target)
{
return QuickSelect(nums, 0, pivot - 1, target);
}
else
{
return QuickSelect(nums, pivot + 1, r, target);
}
}
int findKthLargest(vector<int>& nums, int k) {
int res = QuickSelect(nums, 0, int(nums.size()) - 1, int(nums.size()) - k);
return res;
}
};