python中的最小子数组差

python中的最小子数组差,python,algorithm,Python,Algorithm,假设我有一个非空的整数数组:A0..An。考虑参数 p,其中0<p<p>EdE(以前的解有高复杂度,我的坏) 这是你的翻拍,但是要去掉列表上的索引 并使用min内置函数获取最小值 def solution(a): lsum = a[0] rsum = sum(a)-lsum dfs = [abs(rsum-lsum),] for el in a[1:]: lsum+=el rsum-=el dfs.append(ab

假设我有一个非空的整数数组:
A0..An
。考虑参数<代码> p,其中0<p<p>EdE(以前的解有高复杂度,我的坏)

这是你的翻拍,但是要去掉列表上的索引 并使用
min
内置函数获取最小值

def solution(a):
    lsum = a[0]
    rsum = sum(a)-lsum
    dfs = [abs(rsum-lsum),]
    for el in a[1:]:
        lsum+=el
        rsum-=el
        dfs.append(abs(rsum-lsum))
    return min(dfs)

sol = solution([3,1,2,4,3])
print(sol)
产生

1
问题在于:

if next < diff:
    diff = next
    p += 1
else:
    return diff

(注意:我尝试了尽可能少的修改,也就是说,尽可能靠近您的代码。此外,我没有真正测试这一点。但我希望您能理解。)

这更简洁,但仍然是O(n):


可从Python 3.2以上版本获得。

您正在搜索的是
p
,而不是
差异
?这个问题对我来说不是100%清楚。@NiklasR:我同意,这个问题措辞不太好。尽管如此,他还是在寻找差异,而不是P。他说解决方案是
1
。如果
P
是他所关心的,那么解决方案应该是3。复杂性正是
O(n)
,你为什么想要一个更好的解决方案?或者什么“更好”?什么意义上更好?也许python纯粹主义者可以在一行代码中完成这项工作。。但是我很确定你不能比在O(n)中做得更好。我认为你的代码有一个问题:如果差异列表是[1,2,0],你的代码将返回1而不是0。我猜在这种情况下的复杂性O(n^2)似乎更慢,
O(n^2)
love itertools<代码>累积()只是python3。有一个bug。它不适用于两个数组elements@kharandziuk我写道,我没有进行测试,只是想给出一个想法。。我可以稍后在电脑前修复它。但是如果你找到了它,你就不能修复它吗?我只是在指出我刚才在阅读你的代码时看到的错误…@kharandziuk嘿。我现在在一台pc上,我测试了几个小例子,其中有2个元素在数组中。[1,4] => 3, [5,2] => 3, [5, -2] => 3. 最后一个建议使用完整数组而不是空数组。你是说这个是错的吗?两个数组都应该是非空的吗?@kharandziuk:哦,我刚从你的解决方案中看到,你可能希望两个数组都是非空的。我调整了我的代码以符合你的。(编辑:顺便说一句,感谢您接受我的答案,尽管它仍然包含一个bug)。希望现在天气好……;)
sol = solution([3,1,2,4,3])
print(sol)
1
if next < diff:
    diff = next
    p += 1
else:
    return diff
def solution(A):
    lsum, rsum = A[0], sum(A[1:])
    diff = abs(rsum - lsum)
    p = 1
    while p < (len(A)-1):
        lsum += A[p]
        rsum -= A[p]
        next = abs(rsum - lsum)
        if next < diff:
            diff = next
        p += 1
    return diff
import itertools

def min_diff(A):
    total = sum(A)
    return min(abs(total - lsum - lsum) for lsum in itertools.accumulate(A))