我想你可以看看 std::set_difference http://en.cppreference.com/w/cpp/algorithm/set_intersection
我尝试使用通常使用二叉搜索树实现的 set 并且它可以工作。
set<int> s1 = {1, 2, 4, 5};
set<int> s2 = {0, 2, 4, 7};
vector<int> v;
set_intersection(s1.begin(), s1.end(),
s2.begin(), s2.end(),
back_inserter(v));
for (auto i : v)
cout << i << '\n';
输出
2
4
这是问题的递归思路
对于任何长度为 n 的数组 A,我将使用 A[2 .. n] 来表示数组 [A[2], ..., A[n]]
令 A, B 为长度为 n, m 的两个输入数组。
如果其中一个为空,则答案是微不足道的。
否则,让我们比较第一个条目。
如果 A[0] == B[0],那么我们知道 A[0] 出现在两个数组中,我们将 A[0] 存储到输出列表并继续搜索数组 A[2 .. n] 和B[2 .. 米]
如果 A[0]
类似地,如果 A[0] > B[0],我们继续搜索数组 A 和 B[2 .. n]
然后通过递归,您可以找到答案。为什么它适用于二叉搜索树?这是因为我们只需要每个输入的递增序列。我们可以通过在树上按顺序遍历得到这样的序列。