有一个名为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
答案 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)
(在elif
和else
语句中)。这将确保您获得相同的答案,就像您从头开始而不是外循环中的结束一样。进行这两项更改并重新提交您的代码,它应该处理它。