我在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.但是,我仍然感到困惑,以下哪一项是正确的
if(comp.find(value) != comp.end) // as in snippet or
if(comp.find(value) == comp.end) // this one
2.此外,该算法将如何适应,
答案 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)
要运行该代码段,您需要做一些小的更改:-
答案 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 中) ,但我认为布尔值可能是一种更简单的思考方式(最初和这个特定示例)。