algorithm - 找到三个索引 x、y、z,使得 M[x] + M[y] = N[z]

标签 algorithm sorting

给定两个数组(未排序)M 和 N。我必须找到三个索引 x、y(在 M 中)和 z(在 N 中),使得 M[x] + M[y] = N[z]。 我的初始算法需要 O(m *m *n) 解决方案。请注意,我必须找到索引,排序会更改索引。

O(m *m *n) 伪代码(其中 m 和 n 是各自数组的长度):

for(int i = 0; i < m - 1; i++)
    for(int j = i + 1; j < m; j++)
        for(int k = 0; k < n; k++)
            if(M[i] + M[j] == N[k] {
                print i, j, k
            }

我正在寻找更优化的解决方案。

谢谢。

最佳答案

M 插入哈希数组(哈希集/哈希表),这样您将获得 O(1) 包含检查。然后迭代 N 中的所有项目,并在此循环内迭代您的哈希集,伪代码:

foreach(integer x in N)
   foreach(integer setY in hashArray)
      if ( hashArray.Contains( x - setY ) )
         then your solution is: setY + (x-setY) = x;

您可以在线性时间内找到这些项目索引。总体运行时间为O(|N|*|M|)。请记住,您可能需要处理极端情况(例如 x = 2*setY)。

关于algorithm - 找到三个索引 x、y、z,使得 M[x] + M[y] = N[z],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26760451/

相关文章:

arrays - 排序算法值作为位置

algorithm - Shellsort - 如果一个数组是 g-sorted 然后 h-sorted,数组仍然是 g-sorted

python - 使用次要术语(决胜局)在 python 中排序计数器集合

c# - 匹配规则在运行时变化

c# - 查找 2 个数组中 2 个点之间的最小距离

algorithm - 如何优化这个 Haskell 代码在亚线性时间内总结素数?

python - 试图理解插入排序算法

android - Android 移动应用程序的基于兴趣和位置的算法

java - 如何使用算法对未知短信进行分组?

java - 如何对java集合中用户定义的条件列表进行排序