题目内容
有N个整数,请找到其中最大的第K个数。
求解方法
注意,这里题目不是topK问题,但是完全可以利用topK问题来解决。但是从算法上来说,求的是第K大的数,而计算的是前K大的数,必然是进行了额外的计算。这里给出一种基于快速排序的求解第K大数的算法。
public int findKthNum(int[] array, int left, int right, int k) {
int j = partition(array, left, right);
int target = left + k - 1;
if (j == target)
return array[j];
else if (j > target)
return findKthNum(array, left, j - 1, k);
else
return findKthNum(array, j + 1, right, k - (j - left + 1));
}
public int partition(int[] array, int left, int right) {
int j = left;
int index = getRandom(left, right);
for (int i = left; i <= right; i++) {
if (i != index && array[i] < array[index]) {
int temp = array[j];
array[j] = array[i];
array[i] = temp;
j++;
}
}
int temp = array[j];
array[j] = array[index];
array[index] = temp;
return j;
}
public int getRandom(int left, int right) {
double index = Math.random();
return (int) (index * (right - left) + left);
}
复制代码