【问题标题】:Searching triplets in two arrays在两个数组中搜索三元组
【发布时间】:2020-02-15 01:37:53
【问题描述】:

给定两个数组 a 和 b,大小为 n。我必须从 a 中选择一个元素,从 b 中选择两个元素,这样。 a[i] * a[i] = b[j] * b[k].

我能够在O(n^2 log(n)) 中找到BruteForce,遍历数组和二进制搜索值。但不知道如何进一步改进。

我如何计算所有这些数字,其中元素范围为 1 <= a[i] <= 10^61 <= n <= 10^6

【问题讨论】:

  • 如果它们是整数(而不是浮点数,您需要与容错进行比较),您可以将 a 的平方存储在哈希表中以在 O(1) 中查找时间而不是 O(log n) 时间。这将其归结为 O(n + m^2),其中 m 是 b 的长度,这可能与您能做的一样好,因为问题与 3SUM 非常相似。
  • This question 不是完全重复的,但那里的答案应该可以解决您的问题。
  • 从 1 到 a[i] 得到 a[i] * a[i] 的所有因子。通过在地图中预先添加 B 的所有值来检查这些因素是否存在于 B 中。使用重复有点棘手,但您可以保持计数来克服这个问题。
  • 如果对您有帮助,请考虑接受答案。

标签: algorithm time-complexity binary-search


【解决方案1】:

嗯,我可以考虑 O(n²) 解决方案。

unordered_multiset S = {}
for each element B in b {
    S = S ∪ B
}

首先,我们将b 的所有元素存储在unordered_multiset 中。这样的结构可以在 O(1) 时间内找到元素,如果你添加 2 个或更多相等的元素,它也知道。

for each element B in b {
    for each element A in a {
        if( A² % B != 0 ) continue;                            //making sure it's divisible
        let occurrencies = number_of_occurrencies(A² / B, S);
        if( occurrencies > 0 ) {                               //if (A² / B) is in S
            if( A == B and ocurrencies > 1 ) {
                //your answer is A, B and B
            }
            else if ( A != B ) {
                //your answer is A, B and A² / B
            }
        }
    }
}

在这里你循环遍历两个数组。主要目标是检查b 中的每个元素,它必须与哪些元素相乘才能等于a 的某些元素的平方。它检查B需要的元素是否已经在S中。

这里面有一个小技巧。如果A = 30B = 30,这意味着你想在b 中再有30 个不是B。这就是多集的原因。如果整个集合中只有一个 30,您知道您正在尝试将 B 与自身匹配,但您不能这样做,因此您必须在 b 中至少有 2 个值为 30 的元素。

【讨论】:

  • 整数除法会导致错误的结果,8*8 = 64,现在说 b 中有 6 和 10,64/6 = 10,所以我们得到 8、6、10,这是错误的。
  • 已编辑以解决此问题。
猜你喜欢
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多