查找数组中的所有元素对,使其差值的绝对值为x

时间:2017-10-18 16:55:17

标签: java arrays algorithm

我有一个未排序的数组,我想找到该数组中的所有对,以便它们的差异(绝对值)给出x。

例如,如果x = 8并且我们有数组{13,1,-8,21,0,9,-54,17,31,81,-46},我会得到: 指数0& 3的值为13& 21(例如,13-21 = | 8 |) 指数1& 5的值为1& 9 指数2& 4,值为-8& 0 指数6& 10,值为-54& -46

我做了一个解决方案,但我不确定它是O(n)还是O(n ^ 2)。我试图避免嵌套循环,而是保留两个指针i和j,但我仍然认为它是O(n ^ 2)?它有点像嵌套循环。

int i = 0;
int j = 1;

    System.out.println("All pairs of elements of the array that subtract exactly to absolute value of " + x + " are:");

    while (i < A.length && j < A.length)
    {
        if (abs(A[i] - A[j]) == x)
        {
            System.out.println("Indices " + i + " & " + j + " with values " + A[i] + " & " + A[j]);
        }

        if (j != A.length - 1)
        {
            j++;
        } else if (i == A.length - 1)
        {
            return;
        } else
        {
            i++;
            j = i + 1;
        }

    }

2 个答案:

答案 0 :(得分:0)

  

它的行为类似于嵌套循环

这不只是“有点” - 你手动编码了两个循环, j -loop逻辑上位于 i -loop内。关键部分是:

i = 0
while i < limit {
    ...
    i += 1
}

j = 1
while j < limit {
    ...
    j = i+1
}

其中每一个都是 - for 循环的版本。

这与if-else逻辑相结合,可以很好地转换为

for i in 0 : limit {
    for j in i+1 : limit {
    }
}

答案 1 :(得分:0)

  1. 您可以使用map来索引数组值,然后计算目标值的补码,并在map中搜索补码索引,即O(1),并将值插入到map中为O(n),所以时间复杂度可以降低到O(1),代码片段如下所示
  2. import java.util。*;

    公共课TwoDiff {

    public static void main(String args[])
    {
        int arr[] = {13, 1,-8, 21, 0, 9,-54, 17, 31, 81,-46};
        int target = 8;
        List<int[]> res = twoDiff(arr, target);
        res.forEach(l -> System.out.println(Arrays.toString(l)));
    }
    
    private static List<int[]> twoDiff(int[] arr, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        List<int[]> resList = new ArrayList<>();
        for(int i=0; i< arr.length; i++)
        {
            map.put(arr[i], i);
        }
        for (int i =0; i < arr.length; i++)
        {
            int complement = arr[i] - target;
            if(map.containsKey(complement))
            {
                resList.add(new int[] {i, map.get(complement)});
            }
        }
        return  resList;
    }
    

    }