收藏一下,請直接點擊原帖地址:http://blog.csdn.net/hpf911/article/details/9275583
這是《劍指Offer》中的一道題目,數組中的元素可能是正負,所以連續的子組求和,會變大也可能變小,解題時首先要求當前的和(初始值為0)和下一個元素求和后,如果是負的,那么重新置0和下下個繼續求和,首先要找到使和增加的正的元素。然后有了當前最大的和后,紀錄下來;繼續累加求和,若新增的元素使和變為負數,那么重新置0,按這個邏輯找出剩余元素的一個最大子組和,若超過前紀錄,覆蓋,直到子組遍歷結束。(動態規划解題方法就是首先想好整個事件發展的邏輯,比如Sn和Sn-1,Sn-2的關系,然后可以用遞歸思想,或者數學上的歸納法得到事件發展規律,但是動態規划不同於遞歸的高復雜度的開銷,它將有用的子結果紀錄到表中,以部分空間來節約時間)下面代碼為置頂鏈接的原帖作者的代碼。
public class FindMaxSumOfSubArray {
/** * @param args */
public static void main(String[] args) {
FindMaxSumOfSubArray f = new FindMaxSumOfSubArray();
int[] arr = { 1, -2, 3, 10, -4, 7, 2, -5 };
System.out.println("MaxSum:" + f.findMaxSum(arr));
}
public Integer findMaxSum(int[] arr) {
int curSum = 0;
int maxSum = 0;
int len = arr.length;
if (arr == null || len == 0) {
return null;
}
for (int i = 0; i < len; i++) {
curSum += arr[i];
if (curSum < 0) {
curSum = 0;
}
if (curSum > maxSum) {
maxSum = curSum;
}
}
// all data are negative
if (maxSum == 0) {
for (int i = 0; i < len; i++) {
if (i == 0) {
maxSum = arr[i];
}
if (arr[i] > maxSum) {
maxSum = arr[i];
}
}
}
return maxSum;
}
}