【题目概要】
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 个最大的元素,而不是第k个不同的数
- 本题尝试了用快排和堆排,但是快排在最后一个例子超时
【代码示例】
int findKthLargest(int* nums, int numsSize, int k){
heap_sort(nums, numsSize);
//numsSize-k代表是排序后数组从右边数的第K个的index,例如倒数第一个就是numsSize-1
return nums[numsSize-k];
}
void swap(int *a, int *b)
{
int temp = *b;
*b = *a;
*a = temp;
}
void max_heapfy(int *nums, int start, int end)
{
int root = start;
int son = 2 * root + 1;
while(son <= end)
{
if(son+1 <= end && nums[son] < nums[son+1])
son += 1;
if(nums[root] > nums[son])
break;
else
{
swap(&nums[root], &nums[son]);
root = son;
son = 2 * root + 1;
}
}
}
void heap_sort(int *nums, int len)
{
int i;
for(i=len/2-1; i>=0; i--)
{
max_heapfy(nums, i, len-1);
}
for(i=len-1; i>0; i--)
{
swap(&nums[0], &nums[i]);
max_heapfy(nums, 0, i-1);
}
}