【发布时间】:2015-10-22 08:50:08
【问题描述】:
假设我有一个非空整数数组:A0..An。并考虑一个参数P where 0 < P <=n。我需要找到被 P 分割的左右子数组之间的最小绝对差。例如:
A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 4
A[4] = 3
P = 1, difference = |3 − 10| = 7
P = 2, difference = |4 − 9| = 5
P = 3, difference = |6 − 7| = 1
P = 4, difference = |10 − 3| = 7
这种情况下的解决方案是1
我完成了下面的代码:
def solution(A):
lsum, rsum = A[0], sum(A[1:])
diff = abs(rsum - lsum)
p = 1
while True:
lsum += A[p]
rsum -= A[p]
next = abs(rsum - lsum)
if next < diff:
diff = next
p += 1
else:
return diff
但我的解决方案有一些错误。它在某些情况下有效,但在某些情况下返回错误答案。例如:在large sequence, numbers from -1 to 1, length = ~100,000这样的条件下,它返回错误的答案
P.S.:我完成了以下解决方案:
def solution(lst):
lsum, rsum = lst[0], sum(lst[1:])
diff = abs(lsum - rsum)
for i in xrange(1, len(lst) - 1):
lsum += lst[i]
rsum -= lst[i]
ndiff = abs(lsum - rsum)
diff = min(diff, ndiff)
return diff
【问题讨论】:
-
您搜索的是
P,而不是difference?这个问题对我来说并不是 100% 清楚。 -
@NiklasR:我同意,这个问题的措辞不是很好。尽管如此,他仍在寻找差异而不是 P。他说解决方案是
1。如果P是他所关心的,那么解决方案应该是 3。 -
复杂度正好是
O(n),为什么要更好的解决方案?或者什么样的“更好”? -
在什么方面更好?可能一个 python 纯粹主义者可以在一行中做到这一点。但我很确定你不能比 O(n) 做得更好。
-
我认为您的代码有问题:如果差异列表是 [1, 2, 0],您的代码将返回 1 而不是 0。