棘手的链表问题

时间:2011-03-21 12:01:56

标签: algorithm linked-list time-complexity

给出三个列表:A,B和C,每个长度为n。如果任何3个三个数字(每个列表1个),总和为零返回true。我想用o(n)复杂度来解决这个问题。我已经对列表进行了排序,我可以想到创建一个总和为2的哈希映射链接列表或将3个列表一起比较[o(n * n * n)]。建议一些方法来即兴发挥方法以降低复杂性......我想不出任何......谢谢你的推荐

3 个答案:

答案 0 :(得分:7)

列表已排序,对吗?在O( n )时间内从 C 中构建一个排序数组 C'

对于每个 n ²对 x a y A × B ,检查 - ( x + y )是否在二元搜索的 C'中。总时间复杂度为O( n ²lg n ),空间复杂度为O( n )。

C 中构建哈希表会使时间复杂度进一步降低到O( n ²),代价是相信O(1)哈希表。

答案 1 :(得分:5)

我认为o(n²)(即更好而不是)是不可能的,但可以在O(n²)中完成(即......如)如下:

首先,反向列表B获取B'(花费O(n)次),这是一个项目按降序排序的列表。首先,我们考虑在列表AB'中找到两个与任何给定数字相加的元素的问题:

我们可以像下面这样(Python代码):

def getIndicesFromTwoArrays(A,B,t):
    a,b=0,0
    while(A[a]+B[b]!=t):
        b=b+1
        if b==len(B):
            return (-1,-1)
        if A[a]+B[b]<t:
            a=a+1
            b=b-1
            if a==len(A):
                return (-1,-1)
    return (a,b)

以上的运行时间为O(n)。所需的额外空间是O(1),因为我们只需要存储两个指针。请注意,上述内容可以轻松转换,以便与双向链表一起使用。

然后,总的来说我们必须做以下事情:

def test(A,B,C):
    B.reverse()
    for c in C:
        if getIndicesFromTwoArrays(A, B, c) != (-1,-1):
            return True
    return False

这会导致运行时间O(n²)和额外空间O(1)

答案 2 :(得分:0)

你不能用O(n)复杂度做到这一点,因为它是NP完全问题(除非P = NP)。查看Wiki page about Subset Sum problem以获取可能的解决方案。