1、167 数组中,找出两个数,和等于给定值

一、 1    一般数组中,找出两个数,和等于给定值                                                                                      点击此处返回总目录

二、167 有序数组中,找出两个数,和等于给定值

 

 

一、一般数组中,找出两个数,和等于给定值     

【题目】

          1、167 数组中,找出两个数,和等于给定值_第1张图片

 

【解答】

1、167 数组中,找出两个数,和等于给定值_第2张图片

 

【分析】题目中没有说元素能不能重复(为什么上面的算法是正确的)。

              如果元素不重复。所有元素都能存入到哈希表中。也就都能查出来。只要考虑一种特殊情况。[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]。

 

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

 

 

【运行结果】

1、167 数组中,找出两个数,和等于给定值_第3张图片

 

 

二、 有序数组中,找出两个数,和等于给定值

【题目】

1、167 数组中,找出两个数,和等于给定值_第4张图片

【分析】

双指针。

 

【代码】

1、167 数组中,找出两个数,和等于给定值_第5张图片

 

【结果】

1、167 数组中,找出两个数,和等于给定值_第6张图片

 

 

 

 

你可能感兴趣的:(7,数据结构与算法)