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 ≤ 数组的长度。
万能的最小堆思路。
C++代码实现:
class Solution {
public:
int findKthLargest(vector& nums, int k) {
int n = nums.size();
if(k < 1 || n < k)
return INT_MIN;
//用最小堆还是最大堆,主要是为了确保我们最终要得到的元素位于堆顶,可以直接取出,
//这时可以看一看堆顶元素在堆中元素中是最大的,还是最小的
//其实这个问题还可以使用最大堆,堆中的元素为最小的n-k+1个元素,则最大堆的堆顶元素即
//为第n-k+1小元素(也就是第k大元素),但是一般来说,k<,greater> q;//最小堆
for(int i = 0;i < n;i++)
{
if(i < k)
q.push(nums[i]);
else
{
int temp = q.top();
if(nums[i] > temp)
{
q.pop();
q.push(nums[i]);
}
}
}
return q.top();
}
};
java代码实现:
class Solution {
public int findKthLargest(int[] nums, int k) {
if(nums.length==0 || k>nums.length)
return Integer.MIN_VALUE;
PriorityQueue prq = new PriorityQueue();
for(int i = 0;ithe_min){
prq.poll();
prq.offer(nums[i]);
}
}
}
return prq.peek();
}
}
利用快排的思想。
代码:
class Solution {
public:
int findKthLargest(vector& nums, int k) {
int n = nums.size();
if(k < 1 || n < k)
return INT_MIN;
int start = 0;
int end = n - 1;
int index = partition(nums,start, end);
//循环前循环用到的变量进行的变量初始值操作
while(index != k-1)
{
if(index > k-1)
{
end = index-1;
index = partition(nums,start, end);
}
else
{
start = index + 1;
index = partition(nums,start, end);
}
}
return nums[k-1];
}
int partition(vector& a, int left, int right)
{
int i = left;
int j = right;
int pivot = a[left];
while(i < j)
{ //注意:根据本题的题意,我们需要降序排序,所以这里需要修改为<=
while(i < j && a[j] <= pivot)
{
j--;
}
a[i] = a[j];
//注意:根据本题的题意,我们需要降序排序,所以这里需要修改为>=
while(i < j && a[i] >= pivot)
{
i++;
}
a[j] = a[i];
}
a[i] = pivot;//根据算法的流程,跳出循环时i==j
return i;
}
};
快速排序:
//快速排序总的写法
void quick_sort(int a[], int left, int right)
{
if(left >= right)
return;
int i = left;
int j = right;
int pivot = a[left];
while(i < j)
{
while(i < j && a[j] >= pivot)
{
j--;
}
a[i] = a[j];
while(i < j && a[i] <= pivot)
{
i++;
}
a[j] = a[i];
}
a[i] = pivot;//根据算法的流程,跳出循环时i==j
quick_sort(a, left, i - 1);
quick_sort(a, i + 1, right);
}
//分离出主要的功能函数的写法
int partition(int a[], int left, int right)
{
int i = left;
int j = right;
int pivot = a[left];
while(i < j)
{
while(i < j && a[j] >= pivot)
{
j--;
}
a[i] = a[j];
while(i < j && a[i] <= pivot)
{
i++;
}
a[j] = a[i];
}
a[i] = pivot;//根据算法的流程,跳出循环时i==j
return i;
}
void quick_sort(int a[], int left, int right)
{
if(left >= right)
return;
int index = partition(a,left,right);
quick_sort(a, left, index - 1);
quick_sort(a, index + 1, right);
}