public static int[] sortArray(int[] arr) {
Arrays.sort(arr);
return arr;
}
public static int findElement(int[] arr, int x) {
int start = 0;
int end = arr.length;
int mid = 0;
while (start <= end) {
mid = (start + end)/2;
if (arr[mid] == x) {
return x;
}
else if (x <= arr[mid]) {
end = mid - 1;
}
else {
start = mid + 1;
}
}
return mid;
}
public static void printKclosest(int arr[], int x, int k)
{
int element = findElement(arr, x);
int count = 0;
for (int i = 0; i < arr.length; i++) {
int difference = Math.abs(arr[i] - element);
while (count < k) {
if (difference > 0) {
System.out.println(arr[i]);
count++;
}
}
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
int[] array = {-1, 3, 5, 2, 1, 7};
sortArray(array);
System.out.println(Arrays.toString(array));
printKclosest(array, 2, 3);
}
}
为了找到k个最近的元素,我想我可以使用for循环遍历数组中的每个元素并从X元素中减去并打印具有最小差异的k个元素的数量,但是输出我得到的是-1 k次。
答案 0 :(得分:1)
函数findElement
会返回x 值,但如果数组中不存在x,则x的潜在位置索引。
所以在第二种情况下,你的比较int difference = Math.abs(arr[i] - element);
毫无意义
如何克服:更改findElement
int end = arr.length - 1;
return x;
to
return mid;
和
difference = Math.abs(arr[i] - arr[element]);
但获得最接近的数字的方法是完全错误的。建议:
将L索引设为element
,将R索引设为element+1
比较L和R的abs差异。输出较小。如果R为较小,则递减L,否则递增R.重复k次(不要忘记数组范围)
答案 1 :(得分:0)
除了MBo使用L和R指针输出k个最接近元素的强烈建议之外,您还可以通过迭代数组一次并保持在O(n log k)时间内对数组进行排序来解决此问题。堆中选择的元素,每次删除最远的第(k + 1)个元素。