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))