数组,题号1、

版权声明:未经同意,严禁转载 https://blog.csdn.net/pengchengliu/article/details/85243759

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]。

              综上所述,本题目可以允许有重复元素。

【运行结果】

猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/85243759