程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 子數組的和的最大值

子數組的和的最大值

編輯:C++入門知識

題目:輸入一個整形數組,數組裡有正數也有負數。數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。求所有子數組的和的最大值。要求時間復雜度為O(n)。

例如輸入的數組為1, -2, 3, 10, -4, 7, 2, -5,和最大的子數組為3, 10, -4, 7, 2,因此輸出為該子數組的和18。

 [cpp] 
/****************************************************************
當我們加上一個正數時,和會增加;當我們加上一個負數時,和會減少。
如果當前得到的和是個負數,那麼這個和在接下來的累加中應該拋棄並重新清零,
不然的話這個負數將會減少接下來的和。基於這樣的思路,我們可以寫出如下代碼。
*****************************************************************/ 
bool g_InvalidInput = false;  //是否無效輸入 
 
int FindGreatestSumOfSubArray(int *pData, int nLength) 

    if((pData == NULL) || (nLength <= 0)) 
    { 
        g_InvalidInput = true; 
        return 0; 
    } 
     
    g_InvalidInput = false; 
     
    int nCurSum = 0; 
    //0x80000000表示最小值-2147483648,考慮到全部輸入為負數 
    int nGreatestSum = 0x80000000; 
    for(int i = 0; i < nLength; ++i) 
    { 
        if(nCurSum <= 0) 
            nCurSum = pData[i]; 
        else 
            nCurSum += pData[i]; 
         
        if(nCurSum > nGreatestSum) 
            nGreatestSum = nCurSum; 
    } 
     
    return nGreatestSum; 

 
 
int fun(int a[],int size) 

    int sum=0; 
    int max=0; 
    for(int i=0;i<size;i++) 
        for(int j=i;j<size;j++) 
        { 
            for(int k=i;k<=j;k++) 
            { 
                sum+=a[k]; 
            }            
            if(sum>max) 
                max=sum; 
            sum=0; 
        } 
        return max; 

 
int main() 

    int a[8]={1, -2, 3, 10, -4, 7, 2, -5}; 
//  int max1=fun(a,8); 
    int max=FindGreatestSumOfSubArray(a,8); 
    cout<<max<<endl; 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved