最大連續子數組求和

題目描述:

HZ偶爾會拿些專業問題來忽悠拿些非計算機專業 的同學。今天測試組開完會後,他又發話了:
* 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全爲正數的時候問題很
* 好解決。但是,如果向量中包含負數,是否應該包含某個負數,並且期望旁邊的整數會彌補它呢?
* 例如:{6,-3,2,7,-15,1,2,2},子向量的最大和爲8(從第0個開始,到第三個爲止)
* 給一個數組,返回它的最大連續子序列的和,你會不會被他忽悠住?(子向量的長度至少是1)

解題思路:

狀態:
*  子狀態:長度爲1,2,3,...,n的子數組的和的最大值
*  F(i):長度爲i的子數組和的最大值,這種定義不能形成遞推關係,捨棄
*  F(i):以arr[i]爲末尾元素的子數組和的最大值
*
*  狀態遞推:
*  F(i)=max(F(i-1)+arr[i],arr[i])
*  F(i)=(F(i-1)>0)?F(i-1)+arr[i]:arr[i]
*
*  初始值:F(0)=arr[0]
*  返回結果:
*  maxsum:所有F(i)中的最大值
*  maxsum=max(maxsum,F(i))

代碼:

 public static int FindGreatestSumOfSubArray(int[] arr){
        if(arr.length == 0 || arr== null) return 0;
        //F(i)初始化-->初始值
        int sum=arr[0];
        //maxsum初始化
        int maxSum=arr[0];
        for(int i=1;i<arr.length;i++){
            //F(i)=(F(i-1)>0)?F(i-1)+arr[i]:arr[i]
            sum=(sum>0)?sum+arr[i]:arr[i];
            //maxSum=max(maxSum,F(i))
            maxSum=(sum<maxSum)?maxSum:sum;
        }
        return maxSum;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章