一. 題目
輸入一個整型數組,數組裏有正數也有負數.數組中一個或連續的多個整數組成一個子數組.求所有子數組的和的最大值.要求時間複雜度爲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