前缀和的应用(求最大连续子数组的和)

  Q:对于一个连续的数组,求其任意连续的子数组和的最大值。

分析:

  1.对于此题,直接应用暴力求解的话,时间复杂度应为O(n^2).

  2.此处应用时间复杂度为O(n)的算法来求解,即前缀和的处理。

首先,函数sum(i,j)表示数组从下标i到下标j的连续元素的和。容易想到:sum(i,j) = sum(0,j) - sum(0,i-1).所以求sum(i,j)的最大值就可以表示为求sum(0,j) - sum(0,i-1)

的最大值问题。显然sum(0,j)的时间复杂度为线性的。只需求出最大的sum(0,j)与最小的sum(0,i-1),(其中j >= i)两者之差即所求结果。

代码如下:

//数组前缀和的处理
#include <stdio.h>
int a[]={1,2,3,-1,-2,5,6};
int sum(int* arr)//求max(sum(0,j))
{
    int m,max = a[0],sum = 0;
    int len = sizeof(a) / 4;
    int i = 1,j = 0;
    for( m = 0; m < len; m++)
    {
        sum += a[m];
        if(sum >= max)
        {
            max = sum;
            j = m;
        }
    }
    sum = 0,max = a[j];
    for( i = j; i >=0; i --)//从a[0]到a[j]中找出最大值,即sum(i,j)最大值
    {
        sum += a[i];
        if(sum >= max)
            max = sum;

    }

        return max;
}
int main()
{
    printf("寻找数组a的最大连续子数组和:\n");
    int res;
    res = sum(a);
    printf("结果为:%d\n",res);


}

  

运行结果: 

 

转载于:https://www.cnblogs.com/wangkundentisy/p/5975125.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值