问题>给定两个排序数组A和B,返回一个数组C,其中包含A和B共有的元素。数组C不能包含重复项。两个排序数组的相交
这是我的解决方案,但我的直觉是它是错误的。但是我找不到反证的反例。 有人可以为我指出吗?或者给我一个反例呢?
更新:
该算法的工作原理如下:
我们坚持一个指针,每个阵列和,直到我们找到一个共同的因素推动这些指针。然后,如果公共元素不在C中,则找到的元素将存储在C中。否则,根据元素,我们相应地将指针向前移动。
#include <iostream>
#include <vector>
#include <random>
#include <iterator>
#include <algorithm>
using namespace std;
vector<int> Intersect(const vector<int>& vecIntsA, const vector<int>& vecIntB)
{
int indA = 0;
int indB = 0;
vector<int> vecIntC;
while(indA < vecIntsA.size() && indB < vecIntB.size())
{
if (vecIntsA[indA] == vecIntB[indB]) {
if (vecIntC.empty() || vecIntC.back() != vecIntsA[indA])
vecIntC.emplace_back(vecIntsA[indA]);
indA++;
indB++;
} else if (vecIntsA[indA] < vecIntB[indB])
indA++;
else // (vecIntsA[indA] > vecIntB[indB])
indB++;
}
return vecIntC;
}
int main()
{
default_random_engine dre;
uniform_int_distribution<int> dist(0, 100);
vector<int> vecIntA;
for(int i=0; i < 20; ++i)
vecIntA.emplace_back(dist(dre));
sort(vecIntA.begin(), vecIntA.end());
copy(vecIntA.cbegin(), vecIntA.cend(), ostream_iterator<int>(cout, ","));
cout << endl;
vector<int> vecIntB;
for(int i=0; i < 24; ++i)
vecIntB.emplace_back(dist(dre));
sort(vecIntB.begin(), vecIntB.end());
copy(vecIntB.cbegin(), vecIntB.cend(), ostream_iterator<int>(cout, ","));
cout << endl;
vector<int> vecIntC = Intersect(vecIntA, vecIntB);
copy(vecIntC.cbegin(), vecIntC.cend(), ostream_iterator<int>(cout, ","));
return 0;
}
我觉得这是其中的一个问题,如果我们知道你的算法是用简单的英语开始的,那么每个人都会有更好的输入。此外,这也有助于将问题与*算法*分开,以及*实现*中的问题。 –
考虑输入包含重复元素的情况。 –
@Mark,请参阅您的案例的输出结果。A:0,0,1,2,2,4,5,5,6,6,6,7,8,9,11,13,13,14 ,15,15,18,18,20,21,24, B:0,2,2,3,3,4,6,6,6,8,8,10,10,10,11,11, 14,16,17, C:0,2,4,6,8,11,14, – q0987