描述:
輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。
要求時間複雜度是o(n)。如果有多對數字的和等於輸入的數字,輸出任意一對即可。
例如輸入陣列1、2、4、7、11、15和數字15。由於4+11=15,因此輸出4和11。
分析:
如果採取窮舉,複雜度為o(n^2),可以換乙個思路,題目相當於對每個a[i],查詢sum-a[i]是否也在原始序列中,每一次要查詢的時間都要花費為o(n),假如採用二分查詢,時間複雜度可以提高到o(nlog n)。
如何將時間複雜度降為o(n)呢?
如果陣列是無序的,先排序(n log n),然後用兩個指標i,j,各自指向陣列的首尾兩端,令i=0,j=n-1,然後i++,j–,逐次判斷a[i]+a[j]是否等於sum。所以,陣列無序的時候,時間複雜度最終為o(n log n + n)=o(n log n)。如果原陣列是有序的,則不需要事先的排序,直接用兩指標分別從頭和尾向中間掃瞄,時間複雜度為o(n),且空間複雜度還是o(1)。
下面是此思路(這裡假定陣列已經是有序的)的python實現:
def
twosum
(str,n):
head=0
tail=len(str)-1
for i in range(len(str)):
if str[head]+str[tail]==n:
print str[head],str[tail]
break
elif str[head]+str[tail]>n:
tail-=1
else:
head+=1
總結:
要想達到時間o(n),空間o(1)的目標,除非原陣列是有序的(指標掃瞄法),不然,當陣列無序的話,就只能先排序,後指標掃瞄法或二分(時間 o(nlog n),空間o(1)),或對映或hash(時間o(n),空間o(n))。時間或空間,必須犧牲乙個以達到平衡。
尋找和為定值的兩個數
尋找和為定值的兩個數 給定乙個陣列 無序或者有序,兩種情況都要考慮 找出和為m的兩個數。最多時間複雜度能有多少?陣列有序的情況,在時間複雜度上我們就省去了排序的o nlogn 我們使用兩端指標掃瞄法是比較簡單的,時間複雜度為o n 空間複雜度為o 1 如下圖所示 然後,判斷它們指向的值之和sum是否...
尋找和為定值的兩個數
題目 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。解析 如果陣列是無序的,先排序 n logn 然後用...
尋找和為定值的兩個數
題目描述 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。分析與解法 咱們試著一步一步解決這個問題 注意闡...