(劍指offer)輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 思路:選定第一個數字,然後遍歷後面的數字求和並與S比較,需要n-1次,不行的話再選定第2,3,,,n個數字,需要n^2次,時間複雜度比較高。更簡單的方法 ...
(劍指offer)輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。
思路:選定第一個數字,然後遍歷後面的數字求和並與S比較,需要n-1次,不行的話再選定第2,3,,,n個數字,需要n^2次,時間複雜度比較高。更簡單的方法可以是定義兩個指針,第一個指向第一個元素,第二個指向最後一個元素,兩個元素相加,如果等於S則輸出這兩個元素,如果大於,則將第二個指針向前移一位,再求和進行比較;如果小於,則將第一個指針向前移一位,再進行求和比較。
1 def findNumberWithSum(data,tsum): 2 i=0 3 j=len(data)-1 4 if not data or not tsum: 5 return [] 6 while i<len(data) and j>0: 7 if data[i]+data[j]==tsum: 8 return (data[i],data[j]) 9 if data[i]+data[j]>tsum: 10 j=j-1 11 if data[i]+data[j]<tsum: 12 i=i+1 13 return ()
知識點:
1、if not x是判斷是否為None的情況,if x is not None這種寫法也是可以的。註意代碼完備性,需判斷傳入參數是否為空。
2、涉及到兩個元素,想到定義兩個指針,避免多層迴圈。
3、要考慮找不到兩個數的情況,可以輸出一個空列表或空元組。