如何使用此for循环将最接近的K整数正确打印到X?

时间:2016-11-30 18:08:17

标签: java algorithm

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次。

2 个答案:

答案 0 :(得分:1)

如果x存在,

函数findElement会返回x ,但如果数组中不存在x,则x的潜在位置索引

所以在第二种情况下,你的比较int difference = Math.abs(arr[i] - element);毫无意义

如何克服:更改find​​Element

  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)个元素。