力扣215:数组中第K大的元素
给定整数数组 nums
和整数 k
,请返回数组中第 k
个最大的元素。
请注意,你需要找的是数组排序后的第 k
个最大的元素,而不是第 k
个不同的元素。
你必须设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4], k = 2 输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6], k = 4 输出: 4
思想:先进行由大到小快速排序。然后输出低k个大的值
代码:
void quickSort(int arr[], int left, int right) {
int i = left, j = right;
// 选择中间元素作为基准值
int pivot = arr[(left + right) / 2];
int temp;
// 当左指针小于等于右指针时,继续循环
while (i <= j) {
// 从左向右找到第一个大于或等于基准值的元素
while (arr[i] > pivot)
i++;
// 从右向左找到第一个小于或等于基准值的元素
while (arr[j] < pivot)
j--;
// 如果左指针仍然在右指针的左边,交换这两个元素的位置
if (i <= j) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
};
// 递归地对左半部分进行快速排序
if (left < j)
quickSort(arr, left, j);
// 递归地对右半部分进行快速排序
if (i < right)
quickSort(arr, i, right);
}
int findKthLargest(int* nums, int numsSize, int k) {
// 对数组进行快速排序
quickSort(nums, 0, numsSize - 1);
return nums[k-1];
}