检查数组中的一对元素,其总和等于给定的总和

时间:2017-01-21 03:21:11

标签: arrays algorithm

我在Google here

的Coding视频中找到了此片段
bool HasPairWithSum(const vector<int> data, int sum){
  unordered_set<int> comp; //complements
    for(int value : data){
      if(comp.find(value) != comp.end)
        return true;
      comp.add(sum - value);
    }
    return false;
}

检查数组对是否存在于总和等于给定总和的数组中,

以下测试用例的工作原理如视频中所述

  • {1,2,3,9}鉴于Sum = 8
  • {1,2,4,4}鉴于Sum = 8

1.但是,我仍然感到困惑,以下哪一项是正确的

if(comp.find(value) != comp.end) // as in snippet or
if(comp.find(value) == comp.end) // this one

2.此外,该算法将如何适应,

  • {1,2,4,6}鉴于Sum = 8

3 个答案:

答案 0 :(得分:0)

if(comp.find(value) != comp.end)

以上代码段是正确的。他们正在做的是他们在补偿中添加补充价值(即,如果总和是8然后2具有互补值6),并且一旦他们找到补充值,他们就会返回真实。例如

{1, 2, 4, 6} Given Sum = 8

7添加6添加4添加然后当他们搜索6时它不会返回comp.end因此将输入if并返回true。

答案 1 :(得分:0)

要运行该代码段,您需要做一些小的更改:-

  • comp.end =====> comp.end()
  • comp.add()=====> comp.insert()

答案 2 :(得分:0)

首先,我意识到这是一个老问题。但我最近看了同样的视频并且想知道同样的事情(因为我不熟悉 C++)。这是我在进行一些挖掘后学到的东西。


我认为考虑这个问题的一个好方法是将 comp.end - 从技术上讲应该是 comp.end() - 类似于 falsy 值*。

所以如果我们允许,我们可以遍历第二个测试用例的每次迭代并检查它是否有意义。

对于输入 {1, 2, 4, 4} Given Sum = 8,无序集合中的补码在迭代结束时将为 c={7,6,4}

因此在 for-each 中,比较 if(comp.find(value) != comp.end) 将如下所示:

  • if(comp.find(1) != comp.end) ==> if(false != false) ==> if(false) as c={}
  • if(comp.find(2) != comp.end) ==> if(false != false) ==> if(false) as c={7}
  • if(comp.find(4) != comp.end) ==> if(false != false) ==> if(false) as c={7,6}
  • if(comp.find(4) != comp.end) ==> if(true != false) ==> if(true) as c={7,6,4}

对于每次比较,您将拥有 false != false,它将评估为 false,并且不会进入返回 true 的 if 语句,直到您最终到达最后一次比较,其中 true != false 的计算结果为 true

(因为这个问题所基于的例子是在白板上完成的,我写了一个小program来说明相同的逻辑。)


*如果你阅读了一些关于它的文档,你会看到 end() 方法返回一个迭代器 past-the-end 元素,据我所知,它似乎在外面的集合。 (而 find() 方法在找到时返回 元素处的迭代器,如果未找到则返回 past-the-end。)

实际上,这里没有布尔值,因为它们实际上是相互比较的迭代器值(并且像 comp.find(7) == comp.find(6) 这样的东西会评估为 false,尽管两个值都在 comp 中) ,但我认为布尔值可能是一种更简单的思考方式(最初和这个特定示例)。