如何在O(n)时间内找到列表中的k个最大整数?有人能给我一个伪代码吗?
答案 0 :(得分:1)
一种简单的方法是将列表转换为堆并弹出k次。在Python中,可以使用heapq
模块完成此操作。
import heapq
numbers = [6,1,32,8,2,1,9,77,12,-643,-6,3]
def getKLargest(nums, k):
nums = [-x for x in nums]
heapq.heapify(nums)
for _ in xrange(k):
yield -heapq.heappop(nums)
print list(getKLargest(numbers, 5))
print sorted(numbers, reverse=True)[:5]
答案 1 :(得分:-1)
我认为复杂性可能是O(n),而不是严格的O(n)。
public static void swap(int[] a, int m, int n) {
if (a[m] != a[n]) {
a[m] ^= a[n];
a[n] ^= a[m];
a[m] ^= a[n];
}
}
public static int partition(int[] a, int l, int h) {
int i = l - 1;
int p = l + (int) (Math.random() * (h - l));
swap(a, p, h);
for (int j = l; j < h; j++) {
if (a[j] >= a[h]) {
i++;
swap(a, i, j);
}
}
swap(a, i + 1, h);
return i + 1;
}
public static void topK(int[] a, int l, int h, int k) {
if (h - l + 1 >= k) {
int p = partition(a, l, h);
if (p - l + 1 == k) {
return;
} else if (p - l + 1 < k) {
topK(a, p + 1, h, k - (p - l + 1));
} else {
topK(a, l, p - 1, k);
}
}
}