![C#程序员面试算法宝典](https://wfqqreader-1252317822.image.myqcloud.com/cover/733/33643733/b_33643733.jpg)
上QQ阅读APP看书,第一时间看更新
2.10 如何从数组中找出满足a+b=c+d的两个数对
难度系数:★★★☆☆ 被考察系数:★★★★☆
题目描述:
给定一个数组,找出数组中是否有两个数对(a,b)和(c,d),使得a+b=c+d,其中,a、b、c和 d 是不同的元素。如果有多个答案,那么打印任意一个即可。要求时间复杂度低。例如给定数组:{3,4,7,10,20,9,8},可以找到两个数对 (3,8) 和(4,7),使得3+8=4+7。
分析与解答:
要想解决本题的问题,最简单的方法就是使用四重遍历,对所有可能的数对,判断是否满足题目要求,如果满足,那么打印出来,但是这种方法的时间复杂度为O(n4),很显然算法效率太低,不满足题目要求。
下面介绍另外一种方法—Hash法,该方法的主要思路为:以数对为单位进行遍历,在遍历过程中,把数对和数对的值存储在哈希表中(键为数对的和,值为数对),当遍历到一个键值对,如果它的和在哈希表中已经存在,那么就找到了满足条件的键值对。
下面使用HashMap为例给出实现代码:
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_96_01.jpg?sign=1739273973-3iI1PPqERm16Q1jLrYBxRFG5wVm8U2lz-0-5926fd9a19a644bafaa7bb84b74f3a9a)
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_97_01.jpg?sign=1739273973-2ePORWmSVPrUFfqneAOttrgMNdlaIIet-0-33f91ab3b1fc874be8cae033c85f1391)
程序的运行结果为
![](https://epubservercos.yuewen.com/FBAA2E/17977546208666906/epubprivate/OEBPS/Images/978-7-111-65153-6_97_02.jpg?sign=1739273973-OQpQMqV4qCSDaCohCsMg7AFygxklhUqT-0-888b5a7a5270395dcdcbb956489f53db)
算法性能分析:
因为算法使用了双重循环,所以这个算法的时间复杂度为O(n2)。而 HashMap 的插入与查找操作实际的时间复杂度为O(1)。