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

How to find the maximum number of pairs having difference less than a particular value?

本文关键字:何找 小于      更新时间:2023-10-16

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

例如:

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

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

输出应为2。

此外,我可以在O(n^2)中想到一个算法。但是,我需要更好的东西。我想到了散列映射(因为数组中包含重复项而不起作用),想到了按降序和升序对数组进行排序,但实际上无法继续前进。

通常的想法是在排序的范围上循环。这样,您可以将蛮力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

演示