(目前形式的問題是有點混亂。 - 我的答案是假定問題是關於在數組中找到兩個數字,總和爲給定值)
既然給定的數組是未排序的,我假設我們不允許排序數組(即數組的給定順序不能改變)。
最簡單的解決方案恕我直言,是遍歷每個數字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