面試題31: 連續子數組的最大和

一. 題目

輸入一個整型數組,數組裏有正數也有負數.數組中一個或連續的多個整數組成一個子數組.求所有子數組的和的最大值.要求時間複雜度爲O(n).

代碼請到我的代碼庫中下載 Point2Offer

二. 代碼

package week_3;
/**難度係數:***
 * 劍指offer: 連續子數組的最大和
 * 方法:利用當前累加子數組和最大值or動態規劃(未實踐)
 * 測試用例:功能測試(全正數組,全負,有正有負,爲空)
 * @author dingding
 * Date:2017-6-28 10:45
 * Declaration: All Rights Reserved!
 */
public class No31 {
    private static boolean isvalid = true;  //是否有效
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        test4();
    }

    private static int findMaxSumOfSubArray(int[] data,int length){
        if (data == null || length<1) {
            isvalid = false;
            return 0;
        }
        isvalid = true;  //以便下一次調用
        int addToNSum = 0;
        int nMaxSum = 0x80000000; //最小數
        for (int i=0;i<length;i++){
            if (addToNSum<=0) {    //這一步很巧妙
                addToNSum = data[i];
            }else{
                addToNSum +=data[i];
            }

            if (addToNSum > nMaxSum) {
                nMaxSum = addToNSum;
            }
        }
        return nMaxSum;
    }

    /*====================測試用例=================*/
    private static void test(int[] data,int length){
        int result = findMaxSumOfSubArray(data, length);
        if (!isvalid && result == 0) {
            System.out.println("invalid input.");
        }else {
            System.out.println("連續最大子數組和爲: "+result);
        }
    }
    private static void test1() {
        int[] data = {1,-2,3,10,-4,7,2,-5};
        test(data, data.length);
    }

    private static void test2() {
        int[] data = {1,2,3,4,5};
        test(data, data.length);        
    }
    private static void test3() {
        int[] data = {-1,-4,-3,-5};
        test(data, data.length);        
    }

    private static void test4() {
        int[] data = {};
        test(data, data.length);        
    }
}


有不妥當之處,麻煩告知:D

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