3SUM带有反向外环

时间:2016-03-05 18:34:00

标签: python algorithm

有一个名为3SUM的已知问题。

这是一个稍微改变的问题:给定n个整数的数组S,在S中找到三个整数,使得总和最接近给定数字,目标。

我正在尝试在具有代码挑战问题的两个不同站点上为其编写代码。如果我从0开始编写外循环并转发(如在wiki中),我会在两个站点上获得接受的结果。但是,如果我编写如下代码(外部循环和“j”和“k”设置的差异)而不是其中一个,我在某些测试用例中得到了错误的答案(我不知道)。 如果我的代码出现问题,你能告诉我吗?如果代码确实有错误,那么输入会导致错误答案会很棒。

def threeSumClosest(self, A, B):

    A.sort()

    closest = 1000000000

    if len(A) < 3:
        return closest

    for i in xrange(len(A)-1, 1, -1):
        j = 0
        k = i - 1
        while j < k:
            S = A[i] + A[j] + A[k]
            if S == B:
                return B
            elif S > B:
                if closest is None or abs(B - S) < abs(B - closest):
                    closest = S
                k -= 1
            else:
                if closest is None or abs(B - S) < abs(B - closest):
                    closest = S
                j += 1
    return closest

1 个答案:

答案 0 :(得分:1)

您的代码没有任何问题,我认为您的代码失败的测试用例是存在两个正确答案的情况。请考虑以下示例:

A = {1, 2, 3, 6, 10}B = 16

在这种情况下,如果您使用当前设置运行代码(外部循环从结尾开始),那么您的代码将输出17,即10 + 6 + 1;但是,使用“wiki”设置(外部循环从头开始),输出将是15,即10 + 2 + 3。在这两种情况下,答案与B之间的差异为1,但数字不同。

可以轻松检查:在您的代码中,将abs(B - S) < abs(B - closest)的两个条件更改为abs(B - S) <= abs(B - closest)(在elifelse语句中)。这将确保您获得相同的答案,就像您从头开始而不是外循环中的结束一样。进行这两项更改并重新提交您的代码,它应该处理它。