Find the contiguous subarray within an array (containing at least one non-negative number) which has the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.
下面kadane算法。kadane算法是一种多标识变量法,时间复杂度O(n),空间复杂度O(1)
多标识变量法的难点在于标识变量的设计与维护。
算法的基本思想是:
设置两个标识变量,max_so_far 和 max_ending_here
max_so_far 用于记录到当前元素为止(不一定包含当前元素)的和最大的子数组和
max_ending_here 用于记录以当前元素为终点(以当前元素为终点)的和最大的子数组和
假如我们能在单次扫描中维护不停 max_so_far,到达终点时,max_so_far 就是我们要得答案
为了维护 max_so_far ,建立变量 max_ending_here,假设我们的目标值不为负数(启发式信息),
如果前一个 max_ending_here 为负数时,就将子数组记录临时起始点更新为当前下标,子数组和为当前元素值
否则,max_ending_here 加上当前元素
如果 max_ending_here 大于 max_so_far ,更新 max_so_far,同时更新起止点
max_ending_here = max_ending_here<0 ? A[i] : max_ending_here + A[2];
max_so_far = max_ending_here>max_so_far ? max_ending_here : max_so_far;
int maxSubArray(int A[], int n) {
//if (!A || n==0) return 0;
//int begin = 0;
//int end = 0;
//int begin_tmp = 0;
int max_so_far = A[0];
int max_ending_here = A[0];
for (int i = 1; i < n; ++i) {
if (max_ending_here < 0) {
max_ending_here = A[i]; // max_ending_here < 0, 则重置
//begin_tmp = i;
}
else {
max_ending_here += A[i];// max_ending_here > 0, 则累加
}
if (max_ending_here >= max_so_far) {
max_so_far = max_ending_here;
//begin = begin_tmp;
//end = i;
}
}
return max_so_far;
}
代码来自维基百科
http://en.wikipedia.org/wiki/Maximum_subarray_problem
整行注释部分用作寻找和最大的子数组的起止下标