求给定数组的最大子数组

话说前天晚上被网易虐的也是够惨,3道编程题做出来两道,一个运行超时,一个通过率为70%。其实考的是动态规划之类的东西,只可惜我当时没有好好学。虽然牛客网服务器挂了导致考试延长一个小时,但这对我并没有什么实质帮助,不会还是不会呀。
今天开始啃《算法导论》,每天一个算法,坚持!
简单看了下分治这一节,照着书上的思想敲出了”给定数组的最大子数组”的代码,如下:

int FindMidMaxSum(const vector<int>& v, int left, int mid, int right, int* MaxLeft, int* MaxRight)
{
    if (left > mid || mid > right)
        return 0;
    int LeftSum = 0;
    int RightSum = 0;
    int LeftMaxSum = INT_MIN;
    int RightMaxSum = INT_MIN;
    int i;
    for (i = mid;i >= left;--i)
    {
        LeftSum += v[i];
        if (LeftSum > LeftMaxSum)
        {
            LeftMaxSum = LeftSum;
            *MaxLeft = i;
        }
    }
    for (i = mid + 1;i <= right;++i)
    {
        RightSum+= v[i];
        if (RightSum > RightMaxSum)
        {
            RightMaxSum = RightSum;
            *MaxRight = i;
        }
    }
    return LeftMaxSum + RightMaxSum;
}

int FindMaxSubArray(const vector<int>& v, int left, int right,int* i,int* j)
{
    if (left > right)
        return 0;
    if (left == right)
    {
        *i = *j = left;
        return v[left];
    }
    int MaxLeft1, MaxRight1,MaxLeft2, MaxRight2,MaxLeft3, MaxRight3;
    int mid = left + (right - left) / 2;
    int LeftSum = FindMaxSubArray(v, left, mid, &MaxLeft1, &MaxRight1);
    int RightSum = FindMaxSubArray(v, mid + 1, right, &MaxLeft2, &MaxRight2);
    int MidSum = FindMidMaxSum(v, left, mid, right, &MaxLeft3, &MaxRight3);
    if (LeftSum >= RightSum && LeftSum >= MidSum)
    {
        *i = MaxLeft1;
        *j = MaxRight1;
        return LeftSum;
    }
    else if (RightSum >= LeftSum && RightSum >= MidSum)
    {
        *i = MaxLeft2;
        *j = MaxRight2;
        return RightSum;
    }
    else
    {
        *i = MaxLeft3;
        *j = MaxRight3;
        return MidSum;
    }
}

int calculateMax(vector<int> prices) 
{
    int i;
    vector<int> v;
    int left, right;
    for (i = 1;i < prices.size();++i)
    {
        v.push_back(prices[i] - prices[i - 1]);
        cout << prices[i] - prices[i - 1]<<" ";
    }
    cout << endl;
    int sum1=FindMaxSubArray(v, 0, v.size() - 1, &left, &right);
    int a = left;
    int b = right;
    int sum2 = FindMaxSubArray(v, 0, left - 1, &left, &right);
    left = a;
    right = b;
    int sum3 = FindMaxSubArray(v, right, v.size()-1, &left, &right);
    if (sum1 <= sum2 && sum1 <= sum3)
    {
        if (sum2 < 0)
            return sum3;
        if (sum3 < 0)
            return sum2;
        return sum2 + sum3;
    }
    else if (sum2 <= sum1 && sum2 <= sum3)
    {
        if (sum1 < 0)
            return sum3;
        if (sum3 < 0)
            return sum1;
        return sum1 + sum3;
    }
    else
    {
        if (sum1 < 0)
            return sum2;
        if (sum2 < 0)
            return sum1;
        return sum1 + sum2;
    }
}

代码的github地址

本文首发于www.sbrave.cn

【完】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值