理解一对Sum和codaddict算法

时间:2015-10-22 06:51:01

标签: java arrays algorithm

我指的是之前提到的以下question。而且,我对以下提到的解决方案感兴趣:

enter image description here

我试图理解下面的整数数组,我在迭代#5后丢失,如下所示:

让我们说我们的整数数组是:{1,2,3,4,8,9,10}我们应该打印那些总和等于12的对。所以,我试着逐步分析如果我们应用上面提到的会发生什么的方法:

                             Key             Value   
Iteration 1 : i = 0       (12-1) = 11          1 
Iteration 2 : i = 1       (12-2) = 10          2
Iteration 3 : i = 2       (12-3) = 09          3
Iteration 4 : i = 3       (12-4) = 08          4
Iteration 5 : i = 4       // pairs.containsKey is true here so printing 
                             input[i] = 8   

任何人都可以解释一下,为什么我们打印input[i] = 08pairs.get(input[i])),这也是上面第6次迭代中的08?

其次,就codaddict算法而言,我在网上找不到任何东西。

3 个答案:

答案 0 :(得分:1)

<!X>,但i==4input[i] == 8时,等于4,因为在上一次迭代中,当我为3时,我们执行了{{ 1}},或按顺序pairs.get(input[i]))

答案 1 :(得分:1)

我认为你首先需要理解算法。我们想在数组中找到sum为K的数字对。

如果数组中有两个数字(x,y),其中sum为K,那么

x+y = k,
or y = k-x. 

现在,对于数字 x ,我们将 x 映射到键(k-x)

然后对于另一个数字 y ,如果我们发现 y 在地图中,那意味着有一个数字 x 映射(kx),它等于 y 。现在,从地图中我们可以找到原始的 x 并打印出来。

答案 2 :(得分:1)

简要介绍了你引用的答案。要回答你的问题,

  

为什么我们打印输入[i] = 08和pairs.get(input [i]))在上面的迭代#5中也是08?

正在打印input[i] 8pairs.get(input[i])表示pairs.get(8) 4

你需要知道的是,那段Java代码并没有实现Codaddict的逻辑。它看起来有点像,但它只是做了不同的事情:Codaddict将输入值存储为键,索引作为值,而Java实现将(sum-value)作为键存储,value作为值存储。

Java实现不健全。它的作用可以简化为:

public static void printSumPairs(int []input, int sum){
    Set<Integer> previousInts = new HashSet<>();

    for (int i : input) {
        if (previousInts.contains(sum - i)) {
             System.out.print("" + (sum - i) + ", " + i);
        } else {
             previousInts.add(i);
        }
    }
}

这基本上实现了与Java impl相同的结果,并且(我相信)更容易理解。

虽然对于重复的数字不能很好地工作(原始Java impl也是如此)。但是,具有处理数字重复的逻辑实际上很容易。