2.求子数组的最大和

题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。并记录最大子数组的位置。


思路:当加上一个整数时,和会增大,当加上一个负数时,和会减小,当和为负数时舍弃前面的计算,从下个位置重新开始。

 

 

代码:

 

int  findMax( int  a[ ] , int  size ,int *start, int *end )

{

int  tempmax = max = 0;

*start = *end = 0;//记录最大子数组起始结束位置;

for( int i = 0; i < size ; i++ )

{

tempmax = tempmax + a[i] ;

if( tempmax < 0 )//舍弃前面的计算,重新开始

{

tempmax = 0 ;

*start = i + 1 ;

*end = i + 1;

}

if( tempmax > max)

{

max = tempmax ;

*end = i ;

}

}

 

if( max == 0 )//全部为负数

{

max = a[0] ;

for( int i = 1; i < size ; i++ )

{

max = max > a[i] : max ? a[i] ;

}

}

 

retrun  max ;


}


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值