我得到两个包含正整数的数组(可以包含重复项和相同长度)。当数字只能从两个数组中使用一次时,我必须找到绝对差值小于等于特定值(给定)的最大对数。
例如:
arr1 = {1,2,3,4}
arr2 = {8,9,10,11}
diff = 5
然后,可能的对是(3,8),(4,8)。也就是说,只有两个这样的可能对。
输出应为2。
另外,我可以在O(n ^ 2)中想到这个算法。但是,我需要更好的东西。我想到了哈希映射(因为数组包含重复项而无法工作),想到按降序和升序排序数组,实际上无法从那里向前移动。
答案 0 :(得分:0)
通常的想法是遍历已排序的范围。这样,您可以将蛮力O(N^2)
努力降低到O(N log N)
。
这是伪代码中的算法(可能稍后我会用真正的C ++代码更新):
总的来说,这主要取决于平均需要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