题目
给定整数数组 nums 和整数 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
提示:
- 1 1 1 <= k <= nums.length <= 1 0 4 10^4 104
- − 1 0 4 -10^4 −104 <= nums[i] <= 1 0 4 10^4 104
代码
void HeadAdjust(int A[], int k, int len){
A[0] = A[k];
for(int i=k*2; i<=len; i*=2){
if(i < len && A[i+1] > A[i]){//注意判断 i < len
i++;
}
if(A[0] < A[i]){
A[k] = A[i];
k = i;
}
else{
break;
}
}
A[k] = A[0];
}
void BuildMaxHeap(int A[], int len){
for(int i=len/2; i>=1; i--){
HeadAdjust(A, i, len);
}
}
void Swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int findKthLargest(int* nums, int numsSize, int k){
int *numTemps = (int*)malloc(sizeof(int) * (numsSize + 1));
for(int i=0; i<numsSize; i++){
numTemps[i+1] = nums[i];
}
BuildMaxHeap(numTemps, numsSize);
while(k - 1 > 0){
Swap(&numTemps[numsSize], &numTemps[1]);
numsSize--;
HeadAdjust(numTemps, 1, numsSize);
k--;
}
return numTemps[1];
}