1. 程式人生 > >陣列,題號1、

陣列,題號1、

 

 

 

1.兩數之和

【題目】

          

 

【解答】

 

【分析】題目中沒有說元素能不能重複(為什麼上面的演算法是正確的)。

              如果元素不重複。所有元素都能存入到雜湊表中。也就都能查出來。只要考慮一種特殊情況。[3,4,2,5] target=6。當i=0時,查詢6-3=3,查出來的3下標還是0,不符合要求。

              如果元素重複。可以分析出最多隻能重複兩次才有意義。

                      如果重複3次及以上,說明這個數沒有用。比如:[3,2,3,9,3,4] target =7,結果不唯一。[3,2,3,7,3] target =9 ,可以。 

                      如果重複2次,該數要麼沒用,要麼target=這個數的兩倍。[3,3,2,7] target = 5,結果不唯一。[3,3,4,7] target =6,可以。

 

            當元素不重複時,上面的方法能用。

            當元素重複時,上面的方法還能用麼?很多人認為java 中的HashMap對於相同的key只能存一次,會有問題。應該使用C++ STL中的unordered_multimap才行。其實不是。因為當元素重複且重複了兩次時。也就是[3,3,2,7] target =6這種情況。存到HashMap中的是<3,1><2,2><7,3>。而我們的for迴圈是從i=0,開始。也就是首先查詢第1個3。但是HashMap中的是最後一個3。當i=0,時查詢6-3=3時,會把第2個3找出來。滿足(map.get(3) !=null && map.get(3) !=0) 的條件。所以返回[0,1]。

 

              綜上所述,本題目可以允許有重複元素。

 

 

【執行結果】