【发布时间】:2013-11-23 07:01:53
【问题描述】:
有人问我这个问题:
给定大小为n 的ints 和int sum 的数组,我需要返回总和等于sum 的所有数组元素对
std::vector< std::pair<int,int> > find(int* arr,size_t n,int sum)
数组未排序。 我提出了一个使用哈希表的 O(n) 时间解决方案:
traverse the arr
if arr[i] is in the hash
vector.push_back (make_pair(arr[i],sum-arr[i]));
else
insert to the hash sum - arr[i]
该解决方案需要额外的空间用于散列......应该为散列选择什么大小?哪个哈希函数?
你怎么看?有没有更好的方法来解决这个问题?
附:
我知道存在一个额外的解决方案:对数组进行排序;根据当前总和是否大于或小于sum
更新。 存在的答案不是同一个问题 - 我对哈希的正确实现感兴趣。
【问题讨论】:
-
是的,您几乎总结了解决问题的两种方法。我不确定除此之外还有很多话要说。 (哦,它叫做 2SUM)。
-
首先,对数组进行排序,然后找到求和的对。
-
@SChepurin OP 知道这个解决方案。他对哈希的实现很感兴趣。
-
任务是“...返回数组元素的所有对”,但您插入
make_pair(arr[i],sum-arr[i]),其中sum-arr[i]不是给定数组的元素 -
@borisbn - 它是。阅读我如何填充嘘声的方式