[英]Return left and right index of maxsubarray
給定一個數字列表,我試圖找到最大子數組的左右索引,例如對於[-1, 9, 0, 8, -5, 6, -24]
最大子數組將是[9, 0, 8, -5, 6]
所以返回應該是[1, 5]
def max_profit(data):
max_sum = 0
max_right_index = 0
max_left_index = 0
current_sum = 0
for i in data:
current_sum = current_sum + i
if current_sum < 0:
current_sum = 0
if max_sum < current_sum:
max_sum = current_sum
max_right_index = i
return [max_left_index, max_right_index -1]
獲得正確索引的最佳策略是什么?
i
表示什么,您當前所處的index
或您試圖總結的value
? 看起來你在這里搞砸了: current_sum = current_sum + i
& max_right_index = i
。
無論如何,該解決方案被稱為Kadane's Algorithm
,請查看: https://www.geeksforgeeks.org/largest-sum-contiguous-subarray/
我的方法是跟蹤最小子數組和從頭開始的子數組的連續總和,並使用它我們可以找到最大子數組的開始和結束索引,因為開始索引將是最小子數組的結尾 + 1(僅當最小子數組是負數)
def max_subarray(arr):
maximum_subarray_sum = -float('inf')
maximum_value = -float('inf')
maximum_value_index = None
no_positive_value = True
continues_subarray_sum = 0
minimum_subarray_sum = 0
minimum_subarray_end_index = -1
maximum_subarray_start_index = 0
maximum_subarray_end_index = 0
for i in range(len(arr)):
if arr[i] >= 0:
no_positive_value = False
if arr[i] > maximum_value:
maximum_value = arr[i]
maximum_value_index = i
continues_subarray_sum += arr[i]
if continues_subarray_sum < minimum_subarray_sum:
minimum_subarray_sum = continues_subarray_sum
minimum_subarray_end_index = i
current_highest_subarray_sum = continues_subarray_sum - minimum_subarray_sum
if current_highest_subarray_sum > maximum_subarray_sum:
maximum_subarray_sum = current_highest_subarray_sum
maximum_subarray_start_index = minimum_subarray_end_index + 1
maximum_subarray_end_index = i
if no_positive_value:
return [maximum_value, maximum_value_index, maximum_value_index]
else:
return [maximum_subarray_sum, maximum_subarray_start_index, maximum_subarray_end_index]
print(max_subarray([2, -1, 2, 3, 4, -5]))
print(max_subarray([-1, 9, 0, 8, -5, 6, -24]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.