私にとって、検索/ソートの部分がわからなかったので、ここでの説明はすべてひどいものでした。検索/ソートの方法が不明でした。
を構築する必要があることは誰もが知っていますprefixSum
。sum of all elems from 0 to i with modulo m
私たちが探しているものは明らかだと思います。(インデックス i から j までのモジュロ合計を示す)ことを知っているとsubarray[i][j] = (prefix[i] - prefix[j] + m) % m
、prefix[i] が指定されたときの最大値は常に、prefix[i] にできるだけ近いが、わずかに大きい、その prefix[j] です。
たとえば、m = 8 の場合、prefix[i] が 5 の場合、prefixArray にある 5 の次の値を探します。
効率的な検索 (バイナリ検索) のために、接頭辞を並べ替えます。
できないことは、最初に prefixSum を構築し、次に 0 から n まで繰り返して、並べ替えられたプレフィックス配列でインデックスを探すことです。
したがって、潜在的な最大部分配列合計のendIndexを示す 0 から n まで反復し、0 と endIndex の間の並べ替えられた接頭辞を含む並べ替えられた接頭辞配列 (最初は空) を調べます。
def maximumSum(coll, m):
n = len(coll)
maxSum, prefixSum = 0, 0
sortedPrefixes = []
for endIndex in range(n):
prefixSum = (prefixSum + coll[endIndex]) % m
maxSum = max(maxSum, prefixSum)
startIndex = bisect.bisect_right(sortedPrefixes, prefixSum)
if startIndex < len(sortedPrefixes):
maxSum = max(maxSum, prefixSum - sortedPrefixes[startIndex] + m)
bisect.insort(sortedPrefixes, prefixSum)
return maxSum