正数と負数を含む数値配列が与えられた場合、問題は、合計が最大で時間計算量が O(n) である連続したサブ配列を見つけることです。たとえば、[1,-2,3,10,-4 ,7,2,-5] は配列であり、サブ配列 [3, 10, -4, 7, 2] の最大合計は 18 です。では、O(n) 内でこのサブ配列を見つける方法は? どうも
3 に答える
2
このソリューションへのWikiリンク。これは、最大部分配列合計問題と呼ばれます。ソリューションは、O(n) 時間で実行される Kadane によって提供されます。
于 2013-07-17T13:33:09.677 に答える
0
アイデアは、累積シリーズを見て(値を何かの増分/減分として扱います)、次にこのシリーズの安値とそれに続く高値を見つけることです。
擬似コード:
sum = 0
low = Integer.MaxValue
highestSumSinceLow = Integer.MinValue
For i = 0 to Array.Length-1
sum += Array[i] // keep track of cumulative value since start
If sum < low Then
low = sum // keep track of lowest sum since start so far
substart = i + 1 // and set substart to next value
sumsincelow = sum - low // calculate sum from that low to here
If sumsincelow > highestSumSinceLow Then
highestSumSinceLow = sumsincelow // keep track of highest sumsincelow
subend = i // and set subend to this value
Next i
配列全体を調べた後、合計が最大のサブ配列のインデックスをポイントします (これは ですsubstart
) 。subend
highestSumSinceLow
これはおそらく最も単純で効率的なソリューションです。これは O(n) であり、一時配列を使用しません。開始から終了まで配列を 1 回通過するだけで、開始以降の累積合計の最小値と、それ以降の最大合計を追跡します。
于 2013-07-17T11:52:00.267 に答える
0
これがPythonでの解決策です。アイデアは、最大連続合計を検索することです。その合計が負の場合はリストを空にし、負でない場合はそれらの要素を保持する必要があります。
l = [1,-2,3,10,-4,7,2,-5]
def find_max(l):
s = 0 # Current sum
lsum = [] # Current subarray
res = (0, []) # Max value and subarray
for v in l:
s += v
lsum.append(v)
if s > res[0]:
res = (s, lsum[:])
elif s < 0:
s = 0
lsum = []
return res
print find_max(l)
結果:
(18, [3, 10, -4, 7, 2])
于 2013-07-17T11:46:27.760 に答える