2.10python如何从数组中找出满足 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(n**4);
现介绍字典法:以数对为单位进行遍历,在遍历过程中,把数对和数对的值存在字典中(键为数对的和,值为数对),当遍历到一个键值对时,如果它的和在字典中已经存在,那么就找到了满足条件的键值对。

算法性能分析:
时间复杂度为O(n**2),因为使用了双重循环,而字典的插入与查找操作实际的时间复杂度为O(1);

代码实现:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2020/1/22 19:31
# @Author  : buu
# @Software: PyCharm
# @Blog    :https://blog.csdn.net/weixin_44321080
class Pair:
    def __init__(self, first, second):
        self.first = first
        self.second = second


def findPairs(arr):
    sumPair = dict()  # 键为数对的和,值为数对
    n = len(arr)
    i = 0
    while i < n:  # 遍历数组中所有可能的数对
        j = i + 1
        while j < n:
            sums = arr[i] + arr[j]
            if sums not in sumPair.keys():  # 若数对的和在字典的键中不存在,在加入
                sumPair[sums] = Pair(arr[i], arr[j])
            else:  # 若数对的和存在字典的键中,则满足要求,打印出来即可
                p = sumPair[sums]
                print('(' + str(p.first) + ',' + str(p.second) \
                      + ')', '(' + str(arr[i]) + ',' + str(arr[j]) + ')')
                return True
            j += 1
        i += 1
    return False


if __name__ == '__main__':
    arr = [3, 4, 7, 10, 20, 9, 8]
    findPairs(arr)

结果:
2.10python如何从数组中找出满足 a+b=c+d的两个数对
end

2.10python如何从数组中找出满足 a+b=c+d的两个数对2.10python如何从数组中找出满足 a+b=c+d的两个数对 布欧不欧 发布了56 篇原创文章 · 获赞 2 · 访问量 2037 私信 关注
上一篇:PHP识别电脑还是手机访问网站


下一篇:Swift中利用AppDelegate实现调用指定ViewController中的函数