給定一個包含正數和負數的數列,問題是要找到一個具有最大總和和時間的連續子數組複雜度是O(n),例如,[1,-2,3,10,-4,7,2,-5]是一個數組,並且子數組[3,10,-4,7,2]有最大的總和是18. 那麼如何在O(n)中找到這個子數組? Thx如何在O(n)中找到具有最大和的連續子陣列
0
A
回答
2
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])
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. 找到整數的最大連續總和在陣列
- 2. 在O(n^2)中尋找一個最大可能總和的子矩陣
- 3. 找到最大子陣列
- 4. 如何找到具有O(n)時間複雜度的和k的所有子陣列?
- 5. 找到最大的差異 - O(n)
- 6. 子矩陣N×N矩陣和N非零值的最大和,只有O(N^2)
- 7. 找到連續子集的最大總和,具有不同的條件
- 8. 查找陣列中具有最大度數的最小子陣列的長度
- 9. 找到所有子陣列中最大值的總和
- 10. 查找大小爲n的數組l的所有連續子陣列中的最小數字
- 11. 找到最大的O-O
- 12. 非重疊連續子陣列的最大長度總和
- 13. 如何有效地找到10個最大的子陣列?
- 14. 查找陣列分區最大(左)<最小(右) - 可能在O(N)時間?
- 15. 找到最大總和的連續子集
- 16. 在陣列中找到的最大值
- 17. 證明最大(O(f(n)),O(g(n)))= O(max(f(n),g(n))
- 18. 最大的一筆連續的子陣列(面試問題)
- 19. 給定一個數組和一個和,找到最大長度小於總和的連續子陣列
- 20. 查找具有O(n)的時間和O(1)空間
- 21. 如何在二進制數中找到最大連續數?
- 22. 找到最大連續總和,找到包含點的段
- 23. 如果我想計算具有最大總和的數組中的序列,則計算數組中具有最大總和的序列O(N)
- 24. 如何找到反向也是子序列的最長連續子序列
- 25. 最小長度L(遞歸)的最大連續子序列和
- 26. 在O(n)時間中發現陣列中的10個最大整數時間
- 27. 最大值連續子序列算法
- 28. 如何找到最小/最大值由軸在numpy的陣列
- 29. 如何在矩陣w/o max函數的每一行中找到最大值?
- 30. 如何在O(n + m)的有向圖中找到母頂點?
[Kadane's algorithm for the maximum subarray problem](http://en.wikipedia.org/wiki/Maximum_subarray_problem#Kadane.27s_algorithm) –