1. 程式人生 > >【C++】陣列中連續子陣列的最大和

【C++】陣列中連續子陣列的最大和

題意:Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.
計算陣列中連續子陣列的最大和。
方法一:使用陣列index作為輔助陣列。index[i]表示的是從0到i的連續子陣列的最大值。
在計算index[i]的時候逐步遍歷元素i到0的資料,使他們相加,子相加的過程如果有和大於index[i]的就將值賦值給index[i]。
程式碼如下所示:

int GetMaxSumLength(vector<int> num){
    if(num.size()==0)
        return 0;

    vector<int> index(num.size(),0);
    for(int i=0;i<num.size();++i){
        index[i]=num[i];
        int tempSum=index[i];
        for(int j=i-1;j>=0;j--){
            tempSum+=num[j];
            if(tempSum>index[i])
                index[i]=tempSum;
        }
    }

    int
result =num[0]; for(auto &v: index){ cout<<v<<" "; if(v>result) result=v; } return result; }

不得不說這個很二逼的做法,時間複雜度應該是O(n*n),不過貴在其思想,有很多動態規劃的時候就是這麼來的:使用一個額外空間(如index[]),而index[i]就表示的是從0到i的某個狀態,而且要無後效性(一個逼格很高的詞,意思就是儘量減少前面資料對於後面資料的影響),最後通過某種遞推的方式得到最有的解。
下面是對上述程式碼的改進:
方法二:思路與方法一基本相同。只是在計算index[i]的時候有所不同。若index[i-1]是負值,則index[i]不變,否則index[i]為index[i-1]+index[i];

int GetMaxSumLength2(vector<int> num){
    if(num.size()==0)
        return 0;
    vector<int> index(num.size(),0);
    index[0]=num[0];
    for(int i=1;i<num.size();++i){
        index[i]=num[i];
        if(index[i-1]>0)
            index[i]+=index[i-1];

    }
    int result =num[0];
    for(auto &v: index){
        cout<<v<<"  ";
        if(v>result)
            result=v;
    }

    return result;

}