题目描述:给定一个数组,找出数组中是否有两个数对(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(n**4)。 因此我们采用另一种方法——字典法,算法的主要思路为:以数对为单位进行遍历,在遍历的过程中,把数对和数对的值存储在字典中(键为数对的和,值为数对),当遍历到一个键值对时,如果他的和在字典中已经存在,那么就找到了满足条件的键值对。
class pair:
def __init__(self, first, second):
self.first = None
self.second = None
self.first = first
self.second = second
def findPairs(array):
sumPair = dict() # 创建一个字典,其中键为数对的和,值为数对
n = len(array)
# 遍历数组中所有可能的数对
i = 0
while i < n:
j = i+1
while j < n:
# 如果这个数对的和在map中没有,则放入map中
sums = array[i] + array[j]
if sums not in sumPair:
sumPair[sums] = pair(i, j)
else:
# 找出已经遍历过的并存储在map中和为sum的数对
p = sumPair[sums]
print( "("+str(array[p.first])+","+str(array[p.second])+"), ("+str(array[i])+", "+str(array[j])+")")
j += 1
i += 1
return False
if __name__ =="__main__":
array = [3, 4, 7, 10, 20, 9, 8]
print(pair.findPairs(array))