求取一个数组最大K个数,返回k个数可以为任意排序,假设数组元素有N个,要求算法时间复杂度不大于O(N*log(K)),空间复杂度为O(1)。
import java.util.*;
public class Solution {
// 找前k个大的数-堆排序
public int[] top_k (int[] arr, int k) {
int end = arr.length-1;
for (int i = end/2; i >= 0; i--) { // 先建堆
adjust(arr, i, end);
}
for (int i = 0; i < k; i++) { // 先交换再调整k次
swap(arr, 0, end);
adjust(arr, 0, --end);
}
int[] res = new int[k];
int idx = 0;
for (int i = 0; i < k; i++) {
res[idx++] = arr[arr.length-1-i];
}
return res;
}
// 调整函数
public void adjust(int[] arr, int idx, int end) {
int imax = idx;
int l = idx * 2 + 1, r = l+1;
if (l <= end && arr[l] > arr[imax]) imax = l;
if (r <= end && arr[r] > arr[imax]) imax = r;
if (imax == idx) return;
else { // 可以交换继续换
swap(arr, imax, idx);
idx = imax;
adjust(arr, idx, end);
}
}
// 辅助交换
public void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}