【问题标题】:Two Sum and its Time Complexity二和及其时间复杂度
【发布时间】:2021-05-16 09:15:05
【问题描述】:

我在 leetcode 上查看了 Two Sum 的两种解决方案,我注意到 n^2 解决方案基本上是测试两个数字的所有组合,看看它们是否总和为 Target。

我理解天真的解决方案遍历数组的每个元素(或更准确地说是 n-1 次,因为我们无法将最后一个元素与自身进行比较)以获取第一个加数,然后另一个循环来获取以下所有内容元素。第二个循环需要迭代 n-1-i 次,其中 i 是第一个加数的索引。我可以看到 (n-1)(n-1-i) 是 O(n^2)。

当我在谷歌上搜索“查找组合的算法”时,问题就出现了,它导致this 线程,其中接受的答案谈到格雷码,这超出了我的想象。

现在我不确定我的假设是否正确,天真的解决方案是格雷码的一个版本,或者其他什么。

如果两个和是一个组合问题,那么它的时间复杂度将是 O(n!/ ((nk)!k!)) 或 O(nCk) 但我看不出它是如何减少到 O(n^2 )

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    我阅读了两个总和问题,它指出:

    给定一个整数数组nums 和一个整数target,返回索引 两个数之和等于target

    这是一个组合问题。然而,仔细观察你会发现这里的 k 值是固定的。

    您需要从给定数字列表中找到两个数字 加起来就是一个特定的目标。

    n个数中的任意两个数都可以nC2方式选择

    nC2 = n!/((n-2)!* 2!)

    = n*(n-1)*(n-2)!/((n-2)!*2)
    
    = n*(n-1)/2
    
    = (n^2 - n)/2
    

    忽略 n 和常数 2,因为当 n 趋于无穷大时几乎没有关系。这些表达式最终导致复杂度为 O(n^2)。

    因此,二和的朴素解决方案的复杂度为 O(n^2)。有关您的问题的更多信息,请查看本文。

    https://www.geeksforgeeks.org/given-an-array-a-and-a-number-x-check-for-pair-in-a-with-sum-as-x/

    【讨论】:

    • 我已经更新了我的答案并添加了一个链接,指向给定问题的更优化解决方案。
    • 当k是固定的时,你有没有机会详细说明nCk = O(n^k)?我在 Math Stackexchange 看到了这个 thread 但是当他们从 (n)(n-1)(n-2)...(n-k+1) 中分解出 n^k 时我被卡住了
    • 我再次更新了我的答案,以解释它如何导致 n^2 复杂性。很抱歉,我无法详细说明此答案中的 nCk = O(n^k) 的方式,因为它需要自己的单独答案
    猜你喜欢
    • 2016-06-17
    • 2012-08-14
    • 1970-01-01
    • 2013-09-12
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2021-06-19
    相关资源
    最近更新 更多