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

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

 

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

 

 

【运行结果】

 

 

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

【题目】

【分析】

双指针。

 

【代码】

 

【结果】

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值