数对之差的最大值 - xiewenfeng/test GitHub Wiki

在数组中,数字减去它右边的数字得到一个数对之差,求所有数对之差的最大值。 如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16-5的结果。

思路1:构造新数组,求新数组子序列的最大和

构造一个辅助数组diff[i] = array[i] - array[i+1],diff[i]+diff[i+1]+...+diff[j]=array[i]-array[j+1]; 这样就变成了求diff[i]+diff[i+1]+...+diff[j]的最大值,也就是连续子数组的最大和问题了,和前面的问题类似了。

private int maxSubTraction(int[] array) {
        if (array == null) return 0;
        if (array.length == 1) return array[0];
        if (array.length == 2) return array[0] - array[1];
        int length = array.length;
        int[] tempArray = new int[length-1];
        for (int i = 0; i < length-2; i ++) {
            tempArray[i] = array[i] - array[i+1];
        }
        return maxSumSubSequence(tempArray);

    }

    private int maxSumSubSequence(int[] array) {
        if (array == null) return 0;
        int maxSum = 0, temSum = 0;
        for (int data : array) {
            temSum += data;
            if (maxSum < temSum) {
                maxSum = temSum;
            } else if (temSum < 0) {
                temSum = 0;
            }
        }
        if (maxSum == 0) {
            maxSum = array[0];
            for (int i = 1; i < array.length; i ++) {
                if (array[i] > maxSum) {
                    maxSum = array[i];
                }
            }
        }
        return maxSum;

    }

思路2:根据前面一个数对差最大值求下一个数对差的最大值

假设已经找到数中中前i个数中数对之差的最大值为diff[i]=max{array[h]-array[k]}(0<=h<k<i),接下来就是新增一个数,求diff[i+1]怎么求,由于diff[i]值已求到,那么array[h]应该是数组中前i-1个数中最大的值,当新增一个数至i+1时,只需要找出数组中前i个数中的最大值,只需要将array[h]与array[i]进行比较,找到最大值,再把最大值减去array[i+1],将差值与diff[i]进行比较即可。

private int maxSubTraction2(int[] array) {
        if (array == null) return 0;
        if (array.length == 1) return array[0];
        if (array.length == 2) return array[0] - array[1];
        int length = array.length;
        int maxSubSum = array[0] - array[1];
        int max = array[0];
        for (int i = 2; i < length; i ++) {
            max = Math.max(max, array[i]);
            if (maxSubSum < (max - array[i])) {
                maxSubSum = max - array[i];
            }
        }
        return maxSubSum;

    }