求子数组的最大和

输入一个整形数组。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

  • 接口

Int GetSubArraySum(Int* pIntArray,Int nCount);

  • 规格

要求时间复杂度为O(n)

  • 举例

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2
因此输出为该子数组的和18

华为OJ上的这道题目与算法导论中最大子序列求和略微不同,在这里没有规定如果数组全为负数的话那么我们就定义最大子序列和为0.
所以要先对这种情况加以判断,然后在运用动态规划里的知识,在时间复杂度为n下进行运算.

完整代码如下:

#include <stdlib.h>
#include <string.h>
#include "oj.h"


/*
功能:
    
输入:pIntArray:数组,nCout:数组长度
    
输出:
     
返回:返回最大值
     
*/

int GetSubArraySum(int* pIntArray, int nCount)
{
    /*在这里实现功能*/
    if(pIntArray==NULL||nCount<1)
    	return -1;
  
	  int b=0,cnt=0,a=pIntArray[0];
	  //全是负数的情形
	  for(int i=0;i<nCount;i++)
	  {
	    if(pIntArray[i]<0)
			  cnt++;

		 if(a<pIntArray[i])
			  a=pIntArray[i];
	  }

	  if(cnt==nCount)
		  return a;

	 int ThisSum,MaxSum,j;
	 ThisSum = MaxSum =0;
	 for(j = 0;j < nCount;j++)
	 {
	    ThisSum += pIntArray[j];
	      
	    if(ThisSum > MaxSum)
	       MaxSum = ThisSum;
	    else if(ThisSum < 0)
	       ThisSum = 0; 
	  }
	    return MaxSum;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值