問題>給定兩個排序數組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