(当前形式的问题有点令人困惑-我的答案假设问题是找到数组中两个数的和等于给定值)
由于给定的数组是未排序的,我假设我们不允许对数组进行排序(即不能改变数组的给定顺序)。
我认为最简单的解决方案是遍历每个数字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”和Java中的“TreeSet”/“HashSet”。行“I-x in seen”将翻译为Java中的“seen.contains(I-x)”和C++中的“seen.find(I-x)==seen.end()”。