在数组中找到两个最相似的值(Java)

时间:2012-08-15 17:35:16

标签: java arrays integer

我有一个整数数组,我想找到两个最相似的值(差异最小)。

实施例:  如果数组中的值为80,100,500,600,501,505,则两个最相似的值为500501。我怎么能这样做?

4 个答案:

答案 0 :(得分:4)

这似乎是一个小任务,我们可以解决这个问题:

1:应用任何有效的排序算法。

2:然后比较相邻元素并选择差异更少。

代码在这里:

void nearestFinder(){
   int array[];
//apply  sorting algorithm - say selection sort
pre_diff = 0;
new_array = selection_sort(array);
   for(int i =0;i<new_array.length();i++){
      diff = Math.abs(new_array[i]-new_array[i+1]);
      if(diff>pre_diff){
       index =i;
       pre_diff =diff;
       }

      }
print(new_array[index],new_array[index+1])
}

答案 1 :(得分:3)

这个问题的诀窍是先对数组进行排序。这样就可以让你只需要比较彼此相邻的数字;选择差异最小的2。

伪码:

sort the array: use Arrays.sort()
 int max_difference = Integer.MAXVALUE
int val1, val2;
for(i=0; i< array_size -1; ++i) {
 int x = array[i+1] - array[i];
 if(x <= max_difference) {
   max_difference = x;
   val1 = array[i];
   val2 = array[i+1];
 }
}

最后,val1val2将包含两个最相似的值。

答案 2 :(得分:2)

如果对数据进行排序,则时间复杂度为O(N * ln(N))

int[] ints = {80, 100, 500, 600, 501, 505};
Arrays.sort(ints);
int value = 0, delta = Integer.MAX_VALUE;
for (int i = 0; i < ints.length - 1; i++) {
    int d = ints[i + 1] - ints[i];
    if (d < delta) {
        delta = d;
        value = ints[i];
    }
}
System.out.printf("value " + value + " and " + (value + delta));

打印

value 500 and 501

答案 3 :(得分:0)

我会遍历每个元素O(N ^ 2)。要找到两个最相似的元素,请使用减法并将差异与存储的最小差异进行比较。然后,一旦找到最低差异(忽略您正在搜索的问题),您还可以存储您正在搜索的号码以及从中减去的号码。您还应该使用绝对值,以便数字的大小是您正在进行的。