【问题标题】:3SUM with reversed outer loop具有反向外循环的 3SUM
【发布时间】:2016-03-05 18:33:59
【问题描述】:

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

这里有一个稍微改动的问题:给定一个包含 n 个整数的数组 S,在 S 中找到三个整数,使得总和最接近给定的数字 target。

我正在尝试在两个不同的站点上为它编写代码,这些站点存在代码挑战问题。如果我从 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

【问题讨论】:

  • 您是否尝试过通过两个版本的算法输入不同的(随机)数字并查看它们的不同之处?

标签: python algorithm


【解决方案1】:

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

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

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

这很容易检查:在您的代码中,将abs(B - S) &lt; abs(B - closest) 的两个条件更改为abs(B - S) &lt;= abs(B - closest)(在elifelse 语句内)。这将确保您得到相同的答案,就好像您从外部循环的开头而不是结尾开始一样。进行这两项更改并重新提交您的代码,它应该会处理它。

【讨论】:

  • 是的,你说得对,我按照你说的改变了两个条件,它通过了所有的测试用例。非常感谢你! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多