【发布时间】:2014-12-03 21:13:24
【问题描述】:
我进行了一次面试,并做了以下描述的问题之一:
给定两个数组,请计算结果:得到并集,然后从并集中删除交集。例如
int a[] = {1, 3, 4, 5, 7};
int b[] = {5, 3, 8, 10}; // didn't mention if has the same value.
result = {1,4,7,8,10}
这是我的想法:
- 排序
a,b。 - 使用
a中的“二分法搜索”检查b的每一项。如果没有找到,通过。否则,从a、b中删除此项 - 结果 =
a中剩余的元素 +b中剩余的元素
我知道这是一个糟糕的算法,但总比没有好。还有比这个更好的方法吗?
【问题讨论】:
-
“二分法搜索” - 你的意思是二分法搜索?
-
寻找
std::set_difference实现,它的C++,但你可以理解 -
假设数组 a 有 n 个元素,b 有 m 个元素...听起来不错,排序给你 O(nlogn) + 搜索每个元素是 O(nlogn) + 生成结果数组是 O (n+m) 的总复杂度为 O(nlogn)(或 O(mlogm),具体取决于 n
-
@P0W
std::set_symmetric_difference可能更好。 -
排序后,认为修改后的合并与mergesort一样。
标签: algorithm language-agnostic