610.Two Sum - Difference equals to target

描述

给定一个整数数组,找到两个数的差等于目标值。index1必须小于index2。注意返回的index1和index2不是0-based。

注意事项

保证只有一个答案。

样例

给定的数组为 [2,7,15,24],目标值为 5,返回 [1,2] (7 - 2 = 5)

思路

同向指针的做法,定义 Pair 是为了在达到排序目的的同时记住原先顺序的下标,输出要求输出原本的下标

代码

class Pair {
    public int idx, num;
    public Pair(int i, int n) {
        this.idx = i;
        this.num = n;
    }
}

public class Solution {
    /*
     * @param nums an array of Integer
     * @param target an integer
     * @return [index1 + 1, index2 + 1] (index1 < index2)
     */
    public int[] twoSum7(int[] nums, int target) {
        int[] indexs = new int[2];
        // 异常情况
        if (nums == null || nums.length < 2)
            return indexs;

        if (target < 0) {
            target = -target;
        }

        // pairs 数组初始化
        int n = nums.length;
        Pair[] pairs = new Pair[n];
        for (int i = 0; i < n; ++i) {
            pairs[i] = new Pair(i, nums[i]);
        }

        // 重写排序方法排序,从小到大排序
        Arrays.sort(pairs, new Comparator(){
            public int compare(Pair p1, Pair p2){
                return p1.num - p2.num;
            } 
        });

        // 找出符合条件的下标
        int j = 0;
        for (int i = 0; i < n; ++i) {
            // 防止 target 等于 0 时,i 和 j 为同一个数
            // 保证 i 和 j 不是相同数
            if (i == j) {
                j++;
            }
            // 固定 i 如果差值小于 target 不断增大 j
            // 如果突然差值大于 target 了则固定 j 通过 for 循环增大 i
            while (j < n && pairs[j].num - pairs[i].num < target) {
                j++;
            }

            // 保证结果的元素输出顺序是按照升序排列的
            if (j < n && pairs[j].num - pairs[i].num == target) {
                // +1 是题目的下标要求
                indexs[0] = pairs[i].idx + 1;
                indexs[1] = pairs[j].idx + 1;
                if (indexs[0] > indexs[1]) {
                    int temp = indexs[0];
                    indexs[0] = indexs[1];
                    indexs[1] = temp;
                }
                return indexs;
            }
        }
        return indexs;
    }
}

你可能感兴趣的:(610.Two Sum - Difference equals to target)