TopK问题是指在一个数据集合中,找出排名前K的元素。常见的解决方案有两种:堆排序和快速选择。
快速选择
快速选择是一种基于快速排序的算法,它通过分治的思想,快速定位排名第K大的元素。首先,选择一个元素作为枢纽元素,然后将整个数据集合分为两个部分,大于枢纽元素的部分和小于枢纽元素的部分。如果小于枢纽元素的部分数量小于K,那么就在大于枢纽元素的部分中找第K-smallest个元素;否则,就在小于枢纽元素的部分中找第K个元素。
下面是TopK问题的Java实现:
public class TopK {
public static int[] topK(int[] nums, int k) {
int left = 0, right = nums.length - 1;
while (true) {
int pivotIndex = partition(nums, left, right);
if (pivotIndex == k - 1) {
break;
} else if (pivotIndex < k - 1) {
left = pivotIndex + 1;
} else {
right = pivotIndex - 1;
}
}
int[] result = new int[k];
for (int i = 0; i < k; i++) {
result[i] = nums[i];
}
return result;
}
private static int partition(int[] nums, int left, int right) {
int pivot = nums[left];
int i = left, j = right;
while (i < j) {
while (i < j && nums[j] < pivot) {
j--;
}
nums[i] = nums[j];
while (i < j && nums[i] >= pivot) {
i++;
}
nums[j] = nums[i];
}
nums[i] = pivot;
return i;
}
}