天天看點

兩數之和等于x

算法導論第2.3-7的習題中要求給出一個運作時間為O(nlgn)的算法,這個算法的功能是能在給定一個由n個整數構成的集合S和另一個整數x時,判斷出S中是否存在兩個其和等于x的元素。

方法一:都知道在一個有序的序列中使用二分查找的時間複雜度是O(lgn)。首先排序,那麼我們可以枚舉集合S中的每一個元素,然後使用二分查找算法查找x-y(y是S中的一個元素),那麼這個算法的時間複雜度是O(nlgn)。

方法二:仍然是首先排序,然後我們用x減去S中的每一個元素,産生的數列存放于數組B,原來S中的n歌數存放于數組A。因為A是有序的,那麼易知B的單調性與A的相反。然後我們使用歸并排序中的merge中使用的排序兩個已經排序的數列的方法進行合并。如果有重複元素即為查找成功。

PS:我感覺既然是集合,那麼元素必然滿足互異性,不知道{1,2,4}這個集合中是不是要排除2+2=4這種,不過我感覺使用上述兩種方法都要進行結果的篩選。