我的算法如下所示:
Initialize:
max_so_far = 0
max_ending_here = 0
Loop for each element of the array
(a) max_ending_here = max_ending_here + a[i]
(b) if(max_ending_here < 0)
max_ending_here = 0
(c) if(max_so_far < max_ending_here)
max_so_far = max_ending_here
return max_so_far
在此基础上,我编写的代码如下所示:
def maxSubArraySum(a,size):
max_so_far = 0
max_ending_here = 0
for i in range(0, size):
max_ending_here = max_ending_here + a[i]
if max_ending_here < 0:
max_ending_here = 0
# Do not compare for all elements. Compare only
# when max_ending_here > 0
elif (max_so_far < max_ending_here):
max_so_far = max_ending_here
return max_so_far
# Driver function to check the above function
a = [-1,-2,-3,-4]
print ("Maximum contiguous sum is", maxSubArraySum(a,len(a))).
这段代码在output 0
时以某种方式给了我array is [-1,-2,-3,-4]
。我现在的代码中有什么要纠正的吗?
答案 0 :(得分:1)
Kadane算法的简单概念是寻找所有正面的 数组的连续段(max_ending_here用于此)。 并跟踪所有正数之间的最大和连续段 段(max_so_far用于此)。
因此,具有所有负数的列表将使算法跳闸。
如果你考虑一下,所有负整数列表的最大总和只不过是max(list_of_negative_integers)
。
但是,如果要创建通用解决方案,
max_in_array
和flag
。 max_in_array
最新。max_so_far
,否则max_in_array
以下是一个参考实现:
def max_sub_array_sum(arr):
max_so_far = max_ending_here = 0
max_in_arr = arr[0]
flag = True
for item in arr:
if flag:
max_in_arr = max(max_in_arr, item)
max_ending_here = max(0, max_ending_here + item)
max_so_far = max(max_so_far, max_ending_here)
if item > 0:
flag = False
return max_in_arr if flag else max_so_far
另一种没有额外变量的方法:
def max_sub_array_sum(arr):
max_so_far = curr_max = arr[0]
for item in arr[1:]:
curr_max = max(item, curr_max + item)
max_so_far = max(max_so_far, curr_max)
return max_so_far
答案 1 :(得分:1)
Python以更短,更易读的代码而闻名,而3.0解决方案可能会对您有所帮助。 为了更好地了解算法,请观看以下视频:-https://www.youtube.com/watch?v=2MmGzdiKR9Y
def max_sub_array_sum(arr):
kadance=[]
#kadance[i]=arr[0]
kadance.append(arr[0])
for i in range(1,len(arr)):
#kadance[i] = max(kadance[i-1]+arr[i],arr[i])
temp = max(kadance[i-1]+arr[i],arr[i])
kadance.append(temp)
ans = kadance[0]
for i in range(1,len(kadance)):
ans = max(ans,kadance[i])
return ans
print(max_sub_array_sum([-1,-2,-3,-4]))
答案 2 :(得分:0)
只需反转if语句-在更新数组之前检查max即可。
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;