回答編集履歴

1 もろもろ追記

can110

can110 score 17901

2018/06/29 22:10  投稿

愚直だけど、こんな感じでもできるかもです。
積算値をキュー的に扱い(前の値を引き現在の値を足す)、計算量はO(n)でいけてると思います。  
```Python
import random
random.seed(110)
cnt = 10
l = [random.randrange(cnt*2) for i in range(cnt)] # rangeも個数に合わせる。(0が連続しないように)
#print(l)
span = 3
# 0番目からspan個を足す。とりあえずこれを最小値とする。
cur_sum = 0
for i in range(span):
   cur_sum += l[i]
#print(cur_sum)
cur_sub = l[0]
min_sum = cur_sum
min_pos = 0
for i in range(1,cnt-span+1):
   # 前の値を引いて、現在の値を足す=現在の積算値
   cur_sum -= cur_sub
   cur_add = l[i+span-1]
   cur_sum += cur_add
   #print('cur pos={} sub={} add={} sum={}'.format(i,cur_sub,cur_add, cur_sum)) #
   cur_sub = l[i]
   if cur_sum <= min_sum:
       min_sum = cur_sum
       min_pos = i
       #print('min pos={} cur_min={}'.format(min_pos,min_sum))
print( 'total_min pos={} sum={}'.format(min_pos, min_sum))
```
境界値をちゃんと考慮できていないかも。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る