Если все A[i] > 0
, вы можете сделать это в O(n lg n)
: предварительно вычислить частичные суммы S[i]
, а затем выполнить двоичный поиск S
для S[i] + M
.Например:
def binary_search(L, x):
def _binary_search(lo, hi):
if lo >= hi: return lo
mid = lo + (hi-lo)/2
if x < L[mid]:
return _binary_search(lo, mid)
return _binary_search(mid+1, hi)
return _binary_search(0, len(L))
A = [1, 2, 3, 2, 1]
M = 4
S = [A[0]]
for a in A[1:]:
S.append(S[-1] + a)
maxsum = 0
for i, s in enumerate(S):
j = binary_search(S, s + M)
if j == len(S):
break
sum = S[j-1] - S[i]
maxsum = max(sum, maxsum)
print maxsum
РЕДАКТИРОВАТЬ: как правильно указывает atuls, бинарный поиск излишний;так как S увеличивается, мы можем просто отслеживать j каждую итерацию и продвигаться оттуда.