我的分析如下:
此題需要注意的是:陣列中可能有重複元素,滿足條件的解不止一組。
例如,給定陣列a[1,3,2,2]和x=4,則滿足條件的解為
(0,1):1+3=4 和(2,3):2+2=4。
解法一:暴力解法
遍歷每個元素a[i],並查詢是否存在乙個值等於x-a[i]的目標元素。
測試用例和執行結果:
解法二:先排序+指標+hashmap
先將給定的陣列排序,再建立兩個指標(i,j),乙個從頭結點往後指i++,乙個從尾節點向前指j--;
分以下三種情況:
int i = 0, j = a.length;
while(i < j)
但是這樣會陣列因為重新排序而使索引混亂,因此在排序前可以將原陣列元素及其索引存入雜湊表中,用指標將元素查詢出來後再通過雜湊表將原索引取出來。
時間複雜度分析,訪問雜湊表是o(n),排序是o(nlog(n)),指標查詢是o(n),一共大約是o(2n+nlog(n))。
解法三:雜湊表
hm:將陣列中的元素和索引以《鍵,值》的形式儲存在雜湊表hm中,(從兩次遍歷雜湊表逐漸優化成一次遍歷雜湊表)(一)首先想到的是兩次遍歷雜湊表:f(n)=2n
*第一次是將陣列中的每個元素和其索引以鍵值對形式儲存在雜湊表中
*第二次是依次遍歷每個元素a[i],看x-a[i]是否是雜湊表中的某個鍵,若存在,則該鍵值即為索引。
但此種情況存在的問題是:因為遍歷會將解輸出兩次,例如出現(1,2)和(2,1)這種情況。
(二)可以將上述兩次遍歷雜湊表變成一次遍歷f(n)=n,即在將陣列元素a[i]加入雜湊表之前先判斷x-a[i]是否已經在當前的雜湊表中,然後再加入,這樣就不會出現重複輸出解了。
* 雜湊錶用空間換取了時間,空間複雜度為o(n),時間複雜度為o(n)
* 缺點:雜湊表中不允許有重複的鍵,故此演算法無法解決陣列中有相同元素的情況。
注:有的題目中會告訴這樣的解有且只有一對,這樣的情況就相對簡單了, 不用考慮重複元素並且只要找出解就可以結束程式了。
在陣列中找出單個的數
1 陣列中所有數都是成對出現,只有乙個數隻出現一次,找出這個數 include int main int len sizeof a sizeof int 計算陣列中數字個數 int num 0 int i 0 for i 0 i len i printf num d n num return 0 2...
在陣列中找出3個數使得它們和為0
給定乙個集合s,試找出3個數a,b,c,使得a b c 0。也即從集合中找出所有的和為0的3個數。例如 集合s 則滿足條件的3個數有2對 1,0,1 和 1,2,1 注意 1,1,0 與 1,0,1 算同乙個解,所以不用重複考慮。當然該例子集合的解也可以寫成 0,1,1 和 2,1,1 這個問題也被...
在陣列中找出3個數使得它們和為k
給定乙個集合s,試找出3個數a,b,c,使得a b c 0。也即從集合中找出所有的和為0的3個數。例如 集合s 則滿足條件的3個數有2對 1,0,1 和 1,2,1 注意 1,1,0 與 1,0,1 算同乙個解,所以不用重複考慮。當然該例子集合的解也可以寫成 0,1,1 和 2,1,1 這個問題也被...