【问题标题】:2 unsorted arrays, find if any pairs of values add up to target?2个未排序的数组,查找是否有任何成对的值加起来达到目标​​?
【发布时间】:2017-06-28 04:49:34
【问题描述】:

所以给定 2 个未排序的数组,我必须找出是否有任何一对值(每个数组中的 1 个)加起来是一个目标。

在 javascript 中,我所做的是从 array1 中找到最大值和最小值,然后创建一个大小为 maxVal-minVal 的数组。

然后我遍历 array1 并在与 array1 的值相对应的新数组的每个索引处放置一个 1。

从那时起我遍历array2并检查newArray[ target - array2[i] ] == 1

这是解决这个问题的好方法吗?

【问题讨论】:

  • 什么是“好的解决方案”?此外,如果您提供实际代码,将有助于我们更好地理解您的算法。

标签: arrays algorithm


【解决方案1】:

是的,就速度而言,这是一个很好的解决方案。然而,这不是在空间方面是一个很好的解决方案,因为这个

创建一个大小为maxVal-minVal的数组

maxVal-minVal 很大时,比如数亿,您需要分配和零初始化一个非常大的数组。如果这两组数字相对较小,比如几千个项目,那么初始化数组所花费的时间可能会超过找到解所花费的时间。

更好的方法是使用基于散列的集合容器代替数组,因为您可以运行算法而无需任何更改,而内存需求将是 O(N),而不是 O(maxVal-minVal)。

在 JavaScript 中,object can be used as a hash-based container

【讨论】:

  • 射击,这可能就是我的几个测试用例失败的原因,哦,好吧。
【解决方案2】:

假设您的两个未排序数组的大小为 M 和 N。您可以使用 HashSet(实现为哈希表的集合)在 O(M+N) 中运行以下算法。

遍历第一个数组,并将每个值添加到 HashSet 中。

然后遍历第二个数组,其中每个项目都可以引用为item[i]。因为您还知道目标值T,所以您知道您正在从第一个数组中寻找T - item[i]。因此,对于第二个数组中的每一项 item[i],在 HashSet 中查找值 T - item[i]。如果找到这样的值,则返回 true。否则,如果你用尽了第二个数组中的所有项,则返回 false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2017-02-08
    • 2018-12-15
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多