【问题标题】:How can you make this python code using for loops run faster? [duplicate]如何让这个使用 for 循环的 Python 代码运行得更快? [复制]
【发布时间】:2019-10-09 23:43:53
【问题描述】:

谁能给我一些建议,让我使用 for 循环让这个长长的 Python 代码运行得更快?这是一个在最接近“目标”的名为“nums”的列表中查找 3 个整数的代码。此代码完全有效,但我可能需要更有效的方法。:

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        clse = 2**31-1
        for a in range(len(nums)):
            for b in range(len(nums)):
                for c in range(len(nums)):
                    if a is not b and b is not c and c is not a:
                        if abs(nums[a]+nums[b]+nums[c]-target) < clse:
                            print(a,b,c)
                            clse = abs(nums[a]+nums[b]+nums[c]-target)
                            anum = nums[a]+nums[b]+nums[c]
        return anum

【问题讨论】:

  • 在不改变算法的情况下,可以并行化最外层的循环。
  • 由于使用了is not(检查对象身份)而不是!=(比较相等性),您的代码从根本上被破坏了。

标签: python algorithm performance


【解决方案1】:

下面的算法应该更高效

创建一个重复的排序列表并将其命名为 b

为列表 a 中的每个元素运行一个循环

从 b 的开头和 b 的结尾选择一个元素,然后添加所有这三个元素

维护一个变量来存储 sum 的值 - 跟踪最接近的目标 可能的配对

如果 sum 的值大于目标,则将 b 的起始索引处的变量向前移动,否则将列表 b 末尾的变量向后移动。 //这 会让你靠近目标

一旦开始和结束变量相遇或添加元素后的总和值继续远离目标,就打破循环并从列表a中选择另一个元素

维护a、b、c和target-sum的值

这应该解决您在 O(n^2) + O(nlogn) 中的问题,这实际上是 O(n^2) 并且是 O(n^3) 的一个很大改进

【讨论】:

    【解决方案2】:

    你得到的每一个结果实际上都会得到几次。你会得到 (1, 2, 3) 然后是 (1, 3, 2) 和 (2, 1, 3) 等等。如果您将更改循环以使 a

    【讨论】:

    • c in range(a, len(nums)) ==> 不应该是c in range(b, len(nums)) 吗?
    • 是的。我修好了。
    • 你不能也说 range(a+1,len(nums)) 这样你甚至可以删除检查如果 a 不是 b 并且 b 不是 c 并且 c 不是 a 的位置跨度>
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2017-11-18
    • 2017-07-11
    相关资源
    最近更新 更多