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

題目:算法

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

n = a + b 設計

解題思路:內存

 

1. 1000w個隨機正整數佔用空間大概38-40MB,並非很大,可是仍須要考慮若是數量級繼續增大的狀況。最好找到不用把數組加載到內存的方法。it

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,符合條件,算法結束!數字

相關文章
相關標籤/搜索