面试题:最大的子数组之和,和最大子数组的始末位置

给出一个数组,求出最大子数组的和以及始末位置。
直接给出代码解释:

int sub_array(int *array,int n)
{
    int max2 = -INF;
    int sum = 0;
    int cur = 0;
    int count2 = 0;
    int flag;
    int _end;
    /*时间复杂度:o(n) 空间复杂度:o(1) */
    while(cur < n)
    {
        /*记录最后一次max改变的位置*/
        _end = cur;
        sum += array[cur++];
        if(sum > max2)
        {
            max2 = sum;
            flag = _end;
        }
        if(sum < 0)
        {
            sum = 0;
            /*如果当前的和是小于的 就取当前的位置下一个位置作为开始*/
            count2 = cur;
        }
    }
    cout << "from " << count2 << "to = " << flag << endl;
    return max2;
}
const int INF = 1<<31;

int sub_array(int a[],int len)
{
    int MAX = -INF;
    int sum = 0;
    int cur = 0;
    int last = 0;
    for(int i=0;i<len;i++)
    {
        sum += a[i];
        if(sum > MAX)
        {
            MAX = sum;
            //记录最后一次改变的位置
            last = i;
        }
        if(sum < 0)
        {
            sum = 0;
            //最后一次改变的时候,当前位置小于0,从下一位置开始
            cur = i+1;
        }
    }
    for(int k=cur;k<=last;k++)
    {
        cout << a[k] << " ";
    }
    cout << endl;
    cout << "from " << cur << "to " << last << endl;
    cout << MAX << endl;
    return MAX;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值