求數組中連續子數組的最大和


問題:

     求解數組中連續一段子數組和的最大值。例如:{31,-41,59,26,-53,58,97,-93,-23,84},最大值為59+26-53+58+97=187

思路:

  計算出任意i到j之間連續子數組的和再比較必然能得到最大值,但時間復雜度為O(n^2),我們希望能找出線性時間的算法。

      我們注意到,假如數組中全為正數,那么最大和必然為全部數相加;如果數組中有負數,並且如果加上某個負數,子數組的和小於0,則最大和子數組必然不包含這個負數。 基於此,給出以下代碼:

     

//計算數組中任何連續子數組的最大和
#include <stdio.h>

int getMaxValue(int data[],int length)
{
    int max = 0,temp = 0;
    int i =0;
    for(i=0;i<length;i++)
    {
        temp = temp + data[i];
        if(temp < 0)
            temp = 0;
        else
        {
            if(temp > max)
                max = temp;
        }


    }
    return max;
}

int main()
{
    int data[] = {31,-41,59,26,-53,58,97,-93,-23,84};
    int length = sizeof(data) / sizeof(int);
    int max = getMaxValue(data,length);
    printf("%d",max);
}

時間復雜度為o(n)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM