(目前形式的问题是有点混乱。 - 我的答案是假定问题是关于在数组中找到两个数字,总和为给定值)
既然给定的数组是未排序的,我假设我们不允许排序数组(即数组的给定顺序不能改变)。
最简单的解决方案恕我直言,是遍历每个数字x
并检查是否I-x
发生在阵列中的任何地方。这实质上就是你的O(n^2)解决方案在做什么。
通过使用某种快速设置的数据结构提高搜索速度,可以将其降低到O(n)或O(nlogn)。基本上,当我们遍历数组时,我们查询是否在集合中出现I-x
。
代码(在Python):
l=[1,2,3,4,5,6,7,8,9]
seen=set()
I=11
for item in l:
if I-item in seen:
print "(%d,%d)"%(item,I-item)
seen.add(item)
解决方案的复杂性取决于您使用set
数据结构的插入/查询的复杂性。基于哈希表的实现具有O(1)复杂性,因此它为您提供O(n)算法,而基于set
的树则生成O(nlogn)算法。
编辑:
等效数据结构Python的set
将在C++ stl::set
和爪哇TreeSet
/HashSet
。行I-x in seen
将转换为Java中的seen.contains(I-x)
和C++中的seen.find(I-x)==seen.end()
。
来源
2011-02-04 06:42:28
MAK
你用C++或Java编程?如果您的问题与语言无关,请移除特定于语言的标签。 – GManNickG 2011-02-04 06:35:41