一、 1 一般数组中,找出两个数,和等于给定值 点击此处返回总目录 二、167 有序数组中,找出两个数,和等于给定值
一、一般数组中,找出两个数,和等于给定值 【题目】
【解答】
【分析】题目中没有说元素能不能重复(为什么上面的算法是正确的)。 如果元素不重复。所有元素都能存入到哈希表中。也就都能查出来。只要考虑一种特殊情况。[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]。
综上所述,本题目可以允许有重复元素。
【运行结果】
二、 有序数组中,找出两个数,和等于给定值 【题目】 【分析】 双指针。
【代码】
【结果】
|