題目:在陣列中尋找和為指定值的兩個數,如arr= ,指定值sum為12,返回4+8=12
方法1:
採用暴力破解(即窮舉),時間複雜度為o(n*n),即對每乙個數arr[i],搜尋sum-arr[i]在不在陣列中。
方法2:
根據方法1,如果陣列已經排好序,可以使用二分查詢sum-arr[i];如果沒有排好序可以使用某種排序演算法對其先進行排序(如平均複雜度為nlogn的快排(取決於劃分元的選擇,可以選取第乙個,或者第乙個和中間元素和最後乙個的中位數,或者隨機選取,或者按照bfprt演算法那樣選取等),nlogn的堆排序或者歸併排序等)。時間複雜度為nlogn。
方法3:
可以採用hash表儲存,對於每乙個元素arr[i],在hash表中查詢sum-arr[j]是否存在,因為hash查詢的時間複雜度為o(1),所以期望的時間複雜度為o(n),但是因為hash表空間有限,所以會產生衝突,解決衝突的方法有鍊錶法和開放位址法等,比如鍊錶法在極端情況下,所有元素都存在乙個鏈中,那麼就退化為o(n*n),這取決於hash函式與hash表的空間大小。這是典型的用空間換取時間。
方法4:
如果只是陣列中最多存在一對這樣的數,便可以採取下面的方法:
比如arr=,sum=12
首先求得sum-arr=
然後定義兩個索引標號i與j,i從arr頭開始向後移動,j從sum-arr尾開始向前移動,哪個指向的元素小,就先移動到大於等於另乙個指向的元素,如果兩個指向的元素相等,則選出該元素,繼續移動,直到到達邊界。選中的兩個元素便是結果,如果選出的元素個數小於2則該陣列中沒有符合條件的。但是該方法有個缺陷,如果含有多對符合條件的元素對,那麼最後要從選出的結果中繼續尋找。
方法5:
如果陣列是無序的,則可以先進行排序(nlogn)。然後定義兩個索引標號i與j,分別指向排序後的陣列的頭和尾,然後i向後移動(++i),j向前移動(++j),到i>=j則停止。
如果arr[i]+arr[j]=sum,則找到了一對,然後++i和++j,繼續尋找;
如果arr[i]+arr[j]>sum,則--j;
如果arr[i]+arr[j]
到i>=j則停止。
時間複雜度為o(n)。
陣列 尋找和為定值的兩個數
題目描述 給定乙個陣列和乙個整數,要求在陣列中找到兩個數,使得它們的和為這個整數.方法 排序夾逼 首先使用快速排序演算法把陣列按公升序排列,然後使用夾逼的方法找到答案.即使用兩個指標分別指向陣列的頭和尾 begin,end 1.若arr begin arr end sum 就輸出 2.若arr be...
尋找和為定值的兩個數
尋找和為定值的兩個數 給定乙個陣列 無序或者有序,兩種情況都要考慮 找出和為m的兩個數。最多時間複雜度能有多少?陣列有序的情況,在時間複雜度上我們就省去了排序的o nlogn 我們使用兩端指標掃瞄法是比較簡單的,時間複雜度為o n 空間複雜度為o 1 如下圖所示 然後,判斷它們指向的值之和sum是否...
尋找和為定值的兩個數
描述 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。分析 如果採取窮舉,複雜度為o n 2 可以換乙個思...