题目描述
在未排序的数组中找到第 k
个最大的元素。请注意,你需要找的是数组排序后的第 k
个最大的元素,而不是第 k
个不同的元素。
样例
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k
总是有效的,且 1 ≤ k ≤ 数组的长度。
算法分析
快速排序的思想
- 1、在特定区间
[l, r]
中,选中某个数x
,将大于等于x
的放在左边,小于x
的放在右边,其中[l, j]
是大于等于x
的区间,[j + 1,r]
是小于x
的区间 - 2、判断出第
k
大与j
的大小关系,若符合大于等于x
,则递归到[l, j]
区间,否则递归到[j + 1,r]
的区间
注意:此处求的是第k
大,而里面的方法k
是指第k
个位置,需要变成k - 1
时间复杂度 $O(n)$
$O(\frac{2}{n} + \frac{4}{n} + … + \frac{n}{n}) = O(n)$
Java 代码
class Solution {
public static void swap(int[] q,int i,int j)
{
int t = q[i];
q[i] = q[j];
q[j] = t;
}
static int quick_sort(int[] nums, int l, int r, int k)
{
if(l >= r) return nums[l];
int i = l - 1, j = r + 1;
int x = nums[l + r >> 1];
while(i < j)
{
do{i ++;} while(nums[i] > x);
do{j --;} while(nums[j] < x);
if(i < j) swap(nums, i, j);
}
if(k <= j) return quick_sort(nums, l, j, k);
else return quick_sort(nums, j + 1, r, k);
}
public int findKthLargest(int[] nums, int k) {
return quick_sort(nums, 0, nums.length - 1, k - 1);
}
}