求取一个数组最大K个数,返回k个数可以为任意排序,假设数组元素有N个,要求算法时间复杂度不大于O(N*log(K)),空间复杂度为O(1)。
import java.util.Arrays;
import java.util.Comparator;
public class Solution {
/**
*
* @param li int整型一维数组
* @param k int整型
* @return int整型一维数组
*/
public int[] top_k (int[] li, int k) {
// write code here
int n = li.length;
// 用插入排序的思想
int[] temp = Arrays.copyOfRange(li, 0, k);
Arrays.sort(temp);
reverse(temp);
for(int i = k; i < n; i++){
if(li[i] > temp[temp.length - 1])
temp[temp.length - 1] = li[i];
Arrays.sort(temp);
reverse(temp);
}
return temp;
}
private static void reverse(int[] arr) {
for(int i = 0; i < arr.length / 2; i++){
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
}
} 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;
}
}