排序重构的问题,求解答

令A为一个由N个已特殊排序数组成的数列:A1,A2,…,AN,其中A1=0。令B为N(N-1)/2个数(定义为Dij=Ai-Aj(i>j))组成的数列。例如,A=0,1,5,8,那么D=1,3,4,5,7,8。请完成:
a) 编写程序,根据A构造D;
b) 编写程序,构造与D相对应的某一个数列A,注意A不是唯一的


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ArrayDemo {

    public static void main(String[] args) {
        Integer[] aArray = new Integer[] { 0, 1, 5, 8 };

        // 第一步获取D数组
        System.out.println("根据A计算得到的数组D:");
        Integer[] dArray = getDArray(aArray);

        for (int i = 0; i < dArray.length; i++) {
            System.out.println(dArray[i]);
        }
        // 第二步根据D数组反求A数组
        System.out.println("反求得到的数组A:");
        Integer[] _aArray = getAArray(dArray);
        for (int i = 0; i < _aArray.length; i++) {
            System.out.println(_aArray[i]);
        }
    }

    /**
     * 构造与D相对应的某一个数列A,注意A不是唯一的
     * 
     * @param dArray
     * @return
     */
    private static Integer[] getAArray(Integer[] dArray) {
        int dLen = dArray.length;
        int aLen = getALen(dLen);
        if (aLen == 0) {
            System.err.println("计算A的数组出错,请确认传入的D数组有效。");
            return null;
        }

        // 因为A1必须为0,可以直接确定A1,并设置A最后一个值为D的最后一个值,保证了最大值。同时A2=A1+D1,A3=A2+D2,依次类推,认为D是有序数组,遍历D数组得到中间A的所有数据
        Integer[] aArray = new Integer[aLen];
        aArray[0] = 0;
        aArray[aLen - 1] = dArray[dLen - 1];
        for (int i = 1; i < aLen - 1; i++) {
            aArray[i] = aArray[i - 1] + dArray[i];
        }
        return aArray;
    }

    /**
     * 根据传入的D数组的长度求出A数组的长度来,就是解一元二次方程n*n-n=2*dLen,n代表A数组的长度
     * 
     * @param dLen
     * @return
     */
    private static int getALen(int dLen) {
        for (int n = 2; n <= 2 * dLen; n++) {
            if (n * n - n - 2 * dLen == 0) {
                return n;
            }
        }
        return 0;
    }

    /**
     * 令aArray为一个由N个已特殊排序数组成的数列:A1,A2,…,AN,其中A1=0。令D为N(N-1)/2个数(定义为Dij=Ai-Aj(i>j
     * )组成的数列。例如,A=0,1,5,8,那么D=1,3,4,5,7,8
     * 
     * @param aArray
     * @return
     */
    private static Integer[] getDArray(Integer[] aArray) {
        int aLen = aArray.length;
        int dLen = aLen * (aLen - 1) / 2;
        List<Integer> tempList = new ArrayList<Integer>();
        for (int i = 0; i < aArray.length; i++) {
            for (int j = i + 1; j < aArray.length; j++) {
                if (tempList.size() == dLen) {
                    i = aLen;
                    break;
                } else {
                    tempList.add(aArray[j] - aArray[i]);
                }
            }
        }
        Integer[] dArray = tempList.toArray(new Integer[0]);
        Arrays.sort(dArray);
        return dArray;
    }
}

思路参考:http://zhidao.baidu.com/link?url=60ZoUclYuzlaRIX1AHJMtEXxqWxfRzhAR7GVW609QZKRORGGi5XWKAZk3fOKPbbqwVbB0Z30HBKw8mXxeE0DlToRR3j7CeRIb9Jej1P9Vm3

不断从D中找出最大的数k,尝试k和x-k,将符合条件的数加入A,并将D中已知的与k相关的差删掉;
这东西我看了,只是在“符合条件的数”和“将D中已知的与k相关的差删掉”不理解,怎样判定符合条件?