求数组中和最大的子数组

【题目一】输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每

个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。

[cpp]  view plain copy
  1. #include "stdio.h"  
  2. #include "conio.h"  
  3.   
  4.   
  5. /* 求一维数组的最大连续子数组元素之和 
  6.    入口 : A 要计算的一维整数数组 
  7.    出口 : iFrom , iTo , iMaxSum 
  8.           分别存放 最大连续子数组的 
  9.           起始位置,结束位置(含结束位置),元素之和 
  10.          如果 iTo = -1 表示 原数组是空数组 
  11. */  
  12.   
  13. void   FindGreatestSumOfSubArray(  
  14.                 int * A,  
  15.                 int N ,  
  16.                 int * iFrom, int * iTo, int * iMaxSum )  
  17. {  
  18.      int i,Sum,K1,K2 ;  
  19.   
  20.      Sum    =0; K1     =0; K2 =-1;  
  21.      *iMaxSum=0; *iFrom =0; *iTo =-1;  
  22.         
  23.      if ( N<1)    return;  
  24.      for ( i=0 ; i <= N-1; i++)  
  25.      {  
  26.           Sum = Sum + A[i];  
  27.           if ( Sum <0 )  
  28.           {  
  29.                Sum    =0; K1 =i+1; K2 =-1;  
  30.           }  
  31.           else  
  32.           {  
  33.               K2=i;  
  34.               if ( *iMaxSum < Sum )  
  35.               {  
  36.                  *iMaxSum=Sum; *iFrom =K1; *iTo =K2;  
  37.               };  
  38.           };  
  39.      };  
  40.      if ( *iTo == -1 )  
  41.      {  
  42.           *iMaxSum= A[0]; *iFrom =0;  
  43.           for ( i =1 ; i<= N-1; i++)  
  44.           {  
  45.               if ( *iMaxSum<A[i])  
  46.                {  
  47.                  *iMaxSum=A[i]; *iFrom = i ;  
  48.                };  
  49.           };  
  50.           *iTo = *iFrom;  
  51.      };  
  52. }  
  53. main()  
  54. {       
  55.     int   a[] ={ 1, -2,    3, 10, -4,  
  56.            7, 2, -500,100,1,  
  57.            2, 8, -50, 55 } ;  
  58.     int M1, M2,SumGt ;  
  59.     FindGreatestSumOfSubArray( &a[0], 14, &M1,&M2, &SumGt);  
  60.       
  61.     printf( "%d %d %d ",M1,M2, SumGt) ;  
  62.       
  63.     getch();  
  64. }  

 

//简化了的方法

[cpp]  view plain copy
  1. int FindGreatestSumofSubArray(const int *iArray, unsigned int nLen, int &iBegin, int &iEnd)  
  2. {  
  3.     if( (NULL == iArray) || (nLen <= 0) )  
  4.         return 0x80000000;  
  5.   
  6.     int nCurSum = 0, nGreatestSum = 0;  
  7.   
  8.     for(unsigned int i = 0; i < nLen; i ++)  
  9.     {  
  10.         if(nCurSum <= 0)  
  11.         {  
  12.             iBegin = i + 1;  
  13.             nCurSum = iArray[i];  
  14.         }  
  15.         else  
  16.         {  
  17.             nCurSum += iArray[i];  
  18.         }  
  19.   
  20.         if(nCurSum > nGreatestSum)  
  21.         {  
  22.             iEnd = i + 1;  
  23.             nGreatestSum = nCurSum;  
  24.         }  
  25.     }  
  26.   
  27.     return nGreatestSum;  
  28.   
  29. }  


 

【题目二】给定一个长度为N的正整数数组,从这N个正整数中找出m个正整数,使这m个正整数之和与正数M最接近...给出这m个正整数...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值