【问题标题】:Find the two most similar values in an array (Java)在数组中查找两个最相似的值(Java)
【发布时间】:2012-08-12 00:54:29
【问题描述】:

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

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

【问题讨论】:

  • 不,不是。我是德国人,我们现在有暂停

标签: java arrays integer


【解决方案1】:

如果对数据进行排序,时间复杂度是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

【讨论】:

    【解决方案2】:

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

    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])
    }
    

    【讨论】:

      【解决方案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 个最相似的值。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 先对数组排序可以把O(n^2)降到O(nlgn)+O(n) = O(nlgn)
        • 谢谢大家。如果您先使用 array.sort,那就太容易了。我怎么会忘记array.sort
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-15
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 2016-06-07
        • 1970-01-01
        相关资源
        最近更新 更多