1. 程式人生 > >算法題:整形數組找a和b使得a+b=n

算法題:整形數組找a和b使得a+b=n

算法 組成 數字 說明 占用空間 都沒有 1-1 素數 個數字

題目:

數組 A 由 1000 萬個隨機正整數 (int) 組成,設計算法,給定整數 n,在 A 中找出 a 和 b,使其符合如下等式:

n = a + b

解題思路:

1. 1000w個隨機正整數占用空間大概38-40MB,並不是很大,但是仍需要考慮如果數量級繼續增大的情況。最好找到不用把數組加載到內存的方法。

2. 若n給定,則數組中大於n的數都沒有用,有用的只是那些處於0和n之間的數字,所以1000w個數字其實可以縮減為長度為n的數組,但是n也可能比1000w大。這並不是解決問題的思路。

3. 考慮用bit記錄數值大小來減少內存需求:每個數組按照位進行存儲,假設數組長度(包括n)在int(32位)範圍內,則最多需要2^31-1 = 2147483647個位,折合內存200M。(這裏的200M只取決於數組元素的取值範圍,跟數組的長度沒有任何關系,這也是位集的缺點之一,如果數據比較稀疏,而且每個元素數值範圍又比較大的時候,位集占用的空間將是一種嚴重的浪費)。

4. 創建一個大小為n的位集,遍歷數組A,若元素a出現,則設置第a位為1。

5. 從第0位開始遍歷,如果第i位和第n-i位都為1,這說明二者都出現過,且相加為n,符合條件,算法結束!

算法題:整形數組找a和b使得a+b=n