给定一个整数型的数组,和一个特定的整数值。编程求出数组中任两个元素的差等于给定整数值的值对?

给定一个整数型的数组,和一个特定的整数值。编程求出数组中任两个元素的差等于给定整数值的值对?
如题,自己初步想了下,貌似是一道关于排列组合的问题,不知道有没有更完美的解决方法?
请赐教

改进的算法,免去了很多不必要的比较。提高算法的效率,保证了结果的正确性。
[code="java"]

import java.util.Arrays;

public class TestClass{

public static void printPairs(int number, int[] list) {
    if (list.length < 2)
        return;
    boolean b = false;
    Arrays.sort(list);
    //首先取最大值,看是否存在这样的值对
    if(number>(list[list.length-1]-list[0])){
        System.out.println("不存在这样的值对");
        return;
    }
    //下面从第一个元素开始判断,和后面的值做差。如果差值超过number,停止与后面更大的数值比较
    for(int i  = 0;i<list.length-2;i++)//最后一个元素不用取。
    {
        int j=i;
        while(number>=(list[j]-list[i])){
            if(number==(list[j]-list[i])){
                b = true;
                System.out.println(list[j]+" "+list[i]);}   
            if(++j>list.length-1)break;//和最后一个数组做差,退出。
        }
    }
    if(!b){System.out.println("不存在这样的值对");}
}

public static void main(String[] args) {
    int number = 51;
    int[] list = { 45, 60, 42, 83, 36, 10, 16, 21, 15 };
    printPairs(number, list);

}

}
[/code]

先排序,再从高到低做减法。

数据小的话用这个。
int i = 0
foreach(int a :arr){
foreach(int b :arr){
if((a-b)== c/*给定的值*/){
i++;
System.out.println(a+" "+b);
}
}
}

程序如下,排序的时间复杂度O(nlgn),后面进行减法需要一次遍历,时间复杂度O(n),总的时机复杂度O(nlgn)

[code="java"]public class TestClass{

public static void printPairs(int number, int[] list) {
    if (list.length < 2)
        return;

    // 使用java工具类排序,也可以自己排序
    Arrays.sort(list);

    for (int i = list.length; i > 1; i--) {
        if (list[i - 1] - list[i - 2] == number) {
            System.out.println("pair: " + list[i - 1] + ", " + list[i - 2]);
        }
    }
}

public static void main(String[] args) {
    int number = 5;
    int[] list = { 45, 60, 42, 83, 36, 10, 16, 21, 15 };
    printPairs(number, list);

}

}[/code]

运行结果:
pair: 21, 16
pair: 15, 10

[quote]能解释一下为什么从高到底依次做差就一定能保证成对的元素呢?会不会有漏掉的呢?[/quote]

恩,你说的对,考虑这个问题时忽略了两个数可能间隔如果各个数的情况,重新改写如下。

[code="java"]public class TestClass{

public static void printPairs(int number, int[] list) {
    if (list.length < 2)
        return;

    // 使用java工具类排序,也可以自己排序
    Arrays.sort(list);
    for (int i = list.length - 1; i > 0; i--) {
        for (int j = i - 1; j >= 0; j--) {
            if (list[i] - list[j] == number) {
                System.out.println("pair: " + list[i] + ", " + list[j]);
            } else if (list[i] - list[j] > number) {
                continue;
            }
        }
    }
}

public static void main(String[] args) {
    int number = 5;
    int[] list = { 45, 41, 60, 42, 40, 83, 36, 10, 16, 21, 15 };
    printPairs(number, list);
}

}[/code]

运行结果:
pair: 45, 40
pair: 41, 36
pair: 21, 16
pair: 15, 10

另外,上面的程序还可以优化,当i固定的时候,可以不从i下一个开始减,因为这样减总的时机复杂度就成了O(n*n), 减的时候开始使用二分法,也就是说,当i固定时,从后面的元素中间元素开始减,依次类推。

使用二分法减总的时机复杂度还是O(nlgn)。