【问题标题】:Check for a pair of elements in an array whose sum is equal to given sum检查数组中的一对元素,其总和等于给定总和
【发布时间】:2017-01-21 03:21:11
【问题描述】:

我从 Google here 的编码视频中找到了这个 sn-p

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} 给定总和 = 8
  • {1, 2, 4, 4} 给定总和 = 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} 给定总和 = 8

【问题讨论】:

    标签: arrays algorithm


    【解决方案1】:
    if(comp.find(value) != comp.end)
    

    上面的sn-p是正确的。他们正在做的是在 comp 中添加互补值(即如果 sum 为 8,则 2 具有互补值 6),一旦找到互补值,它们就会返回 true。例如。

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

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

    【讨论】:

      【解决方案2】:

      要运行 sn-p,您必须做一些小改动:-

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

      【讨论】:

        【解决方案3】:

        首先,我意识到这是一个老问题。但我最近看了同样的视频,想知道同样的事情(因为我不熟悉 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)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)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中),但我认为布尔值可能是一种更简单的思考方式(最初和这个特定的例子)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-26
          • 2019-03-27
          • 2013-07-16
          • 2020-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多