Python程序员面试算法宝典---解题总结: 第二章 栈、队列与哈希 2.10 如何从数组中找出满足 a+b=c+d 的两个数对

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第二章 栈、队列与哈希 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

分析:
之前做过给定数组是有序的情况下,求相同数对的。当时采用从中间向两边扩散的方式来做的。
这道题目给定的数组无序,一种方式就是先排。

关键:
1 书上解法
建立<数对和,数对>的字典即可
便利所有数对就是O(n^2)

参考:
Python程序员面试算法宝典
'''

class Pair(object):
    def __init__(self, first, second):
        self.first = first
        self.second = second


def findEqualPairs(data):
    if not data:
        return
    length = len(data)
    i = 0
    sumToPair = dict()
    while i < length:
        j = i + 1
        while j < length:
            first = data[i]
            second = data[j]
            sum = first + second
            if sum in sumToPair:
                pair = sumToPair[sum]
                info = "find equal pairs, ({first}, {second}), ({fir}, {sec})".format(
                    first=first,
                    second=second,
                    fir=pair.first,
                    sec=pair.second
                )
                print info
            else:
                pair = Pair(first, second)
                sumToPair[sum] = pair
            j += 1
        i += 1


def process():
    data = [3, 4, 7, 10, 20, 9, 8]
    findEqualPairs(data)


if __name__ == "__main__":
    process()

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/91351998
今日推荐