问题> 给定两个排序数组 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;
}