1. 程式人生 > >九章演算法面試題66 2 sum

九章演算法面試題66 2 sum

九章演算法官網-原文網址


題目

給一堆陣列和一個目標值,在這堆數組裡面找出兩個數使得他們的和等於目標值。


線上測試本題

http://www.lintcode.com/en/problem/2-sum/

解答


如果原題的陣列中第i個元素我們用ai來表示,目標值我們用v來表示。

這道題有兩種方法可以解:

方法一:

既然是需要找兩個數使得他們的和為目標值, 一說到查詢我們就會想到hash,因為hash可以幫助我們加快查詢方法。 然後我們可以for迴圈掃一遍我們的陣列,並且hash表儲存在掃到第i個數時候,前面掃過的i-1個數。 這樣我們找的其實是前面有沒有一個元素和第i個數ai 相加為v , 那麼我們只用在hash表裡面去查詢有沒有v-ai這個元素如果有,那麼就說明前面i-1個數中有一個數加上ai 他們的和為v. 這種方法的時間複雜度是O(n),空間複雜度是O(n)。

方法二:

這種方法叫做兩個指標,我們可以先把陣列排序,然後兩個指標分別指向陣列一頭一尾陣列最大和最小的元素,我們把這兩個指標叫做front和end。 如果a[front] + a[end] > v, 那麼說明front右邊所有的元素+end的值都會大於v,所以我們不需要考慮這些元素了。所以只用把end-1,也就是end指標向有陣列左邊移動。 如果a[front] + a[end] < v,那麼說明end左邊所有的元素+end的值也都會小於v,所以我們也不用考慮這些元素了。所以只用把front+1,也就是front指標向陣列右邊移動。 這樣一直迴圈到front指標=end指標停止。用這種方法我們就可以找到兩個指標使得他們的和等於v。 這種方法的時間複雜度是O(nlogn+n) , 空間複雜度是O(1).