题目描述:
在未排序的数组中找到第 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 ≤ 数组的长度。
算法1:
使用堆排序,构建一个大小为K的小顶堆,这种做法也可以作为输入数据流中实时的返回第K大的数
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
priority_queue<int, vector<int>, greater<int>>q;
for(int i=0; i<nums.size(); i++)
{
if(i<k)
q.push(nums[i]);
else
{
if(nums[i] > q.top())
{
q.pop();
q.push(nums[i]);
}
else
continue;
}
}
return q.top();
}
};
算法2:
使用快速排序的partition方法
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int left = 0, right=nums.size()-1;
int index = partition(nums, 0, nums.size()-1);
while(index != nums.size()-k)
{
if(index < nums.size()-k)
{
left = index+1;
index = partition(nums, left, right);
}
else if(index > nums.size()-k)
{
right = index - 1;
index = partition(nums, left, right);
}
else
return nums[index];
}
return nums[index];
}
int partition(vector<int>& nums, int left, int right)
{
int i = left, j = right;
while(i < j)
{
while(i<j && nums[j] >= nums[left])
j--;
while(i<j && nums[i] < nums[left])
i++;
swap(nums[i], nums[j]);
}
swap(nums[left], nums[i]);
return i;
}
};