在 python 中解决 Equi 任务

Solving Equi task in python

来自 http://blog.codility.com/2011/03/solutions-for-task-equi.html

任务是解决一个均衡问题。序列的平衡索引是这样的索引,即较低索引处的元素之和等于较高索引处的元素之和。

例如,在序列A中:

A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0

A = [-7, 1, 5, 2, -4, 3, 0]

3 是均衡指数,因为:

 A[0]+A[1]+A[2]=A[4]+A[5]+A[6]

6也是一个均衡指数,因为:

A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0

当我尝试写一个超级 pythonic 答案时,即:

def solution(A):
    for i in range(len(A)):
        if sum(A[:i]) == sum(A[i+1:]):
            return i 
    return -1

我得到了 O(N**2) 的最坏情况复杂度。 为什么会这样?

如何获得 O(N) 的最佳案例复杂度?

这给我 O(N) 吗? 为什么会这样?

def solution(A):
    total = sum(A)
    sum_left = 0
    for i in range(len(A)):
        sum_right = sum - sum_left
        if sum_left == sum_right:
            return i
    return -1

是的,您的解决方案是 O(N),这是因为您只遍历列表一次,每次迭代都是 O(1)。您之前的解决方案也遍历了列表 1,但它对每次迭代中的所有元素求和,这使得每次迭代也 O(N),导致总复杂度 O(N^2).

但我认为您的解决方案是错误的 - 您没有积累 sum_left。您必须在循环内添加 A[i]

重写为生成器函数,

def solution(a):
    sum_left, sum_right = 0, sum(a)
    for index,value in enumerate(a):
        sum_right -= value
        if sum_left == sum_right:
            yield index
        sum_left += value

然后求所有解,

list(solution([-7, 1, 5, 2, -4, 3, 0]))    # => [3, 6]

只是为了稍微调整 Hugh 的答案,练习要求您 return 平衡指数之一(如果 none 找到,则为 -1),而不是生成器,因此通过的解决方案看起来像:

def solution(A):
    sum_left, sum_right = 0, sum(A)
    for index, value in enumerate(A):
        sum_right -= value
        if sum_left == sum_right:
            return index
        sum_left += value
    return -1