最大子数组和 (Maximum Subarray)

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

整行注释部分用作寻找和最大的子数组的起止下标


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值