如何找到差异小于特定值的最大对数?

时间:2015-06-20 20:11:12

标签: c++ algorithm

我得到两个包含正整数的数组(可以包含重复项和相同长度)。当数字只能从两个数组中使用一次时,我必须找到绝对差值小于等于特定值(给定)的最大对数。

例如:

arr1 = {1,2,3,4}
arr2 = {8,9,10,11}
diff = 5

然后,可能的对是(3,8),(4,8)。也就是说,只有两个这样的可能对。

输出应为2。

另外,我可以在O(n ^ 2)中想到这个算法。但是,我需要更好的东西。我想到了哈希映射(因为数组包含重复项而无法工作),想到按降序和升序排序数组,实际上无法从那里向前移动。

1 个答案:

答案 0 :(得分:0)

通常的想法是遍历已排序的范围。这样,您可以将蛮力O(N^2)努力降低到O(N log N)

这是伪代码中的算法(可能稍后我会用真正的C ++代码更新):

  • 对两个数组进行排序
  • 使用两个迭代器同时循环:
    1. 如果找到一对,请将其插入列表中。增加两个迭代器。
    2. 否则,增加指向较小元素的指标。

总的来说,这主要取决于平均需要O(N log N)的那种。

这是承诺的代码:

auto find_pairs(std::vector<int>& arr1, std::vector<int>& arr2, int diff)
{
    std::vector<std::pair<int,int> > ret;

    std::sort(std::begin(arr1), std::end(arr1));
    std::sort(std::begin(arr2), std::end(arr2));

    auto it1= std::begin(arr1);
    auto it2= std::begin(arr2);

    while(it1!= std::end(arr1) && it2!= std::end(arr2))
    {
        if(std::abs(*it1-*it2) == diff)
        {
            ret.push_back(std::make_pair(*it1,*it2));
            ++it1;
            ++it2;
        }
        else if(*it1<*it2)
        {
            ++it1;
        }
        else
        {
            ++it2;
        }
    }

    return ret;
}

它将两个向量的匹配元素作为std::pairs的向量返回。对于您的示例,它打印

3  8
4  9

DEMO