java 最大子数组_求一个数组中子数组的最大和算法(Java实现)
前幾天在微信訂閱號“待字閨中”中看到的一篇文章《小技巧求一個(gè)數(shù)組中子數(shù)組的最大和》,提供下Java的實(shí)現(xiàn),并且在對題目做下小修改,本來打算直接在微信里直接回復(fù),但是發(fā)現(xiàn)無法回復(fù),然后整理出一篇簡短博客吧。
1. 原題及解答
題目:
輸入一個(gè)整形數(shù)組,數(shù)組里有正數(shù)也有負(fù)數(shù)。數(shù)組中連續(xù)的一個(gè)或多個(gè)整數(shù)組成一個(gè)子數(shù)組,每個(gè)子數(shù)組都有一個(gè)和。求所有子數(shù)組的和的最大值。要求時(shí)間復(fù)雜度為 O(n)。例如輸入的數(shù)組為 1, -2, 3, 10, -4, 7, 2, -5,和最大的子數(shù)組為 3, 10, -4,7, 2, 因此輸出為該子數(shù)組的和 18。
解答:
【只有子數(shù)組“前半部分”的和為正數(shù)時(shí),子數(shù)組的求和才有可能最大】,在這個(gè)trick條件下,只需要遍歷一次數(shù)組就可以。算法是:當(dāng)從頭開始遍歷的元素的求和為正數(shù)時(shí),繼續(xù)向后遍歷。當(dāng)求和為負(fù)數(shù)時(shí),重新開始計(jì)算求和,子數(shù)組的開始重置為下一個(gè)元素。
2. Java實(shí)現(xiàn)
原文提供的是Python的實(shí)現(xiàn),我這里通過Java來實(shí)現(xiàn):
package subarraymaxsum;
public class MaxSumOfSubArray {
public int maxSum(int[] array) {
if (array == null || array.length == 0) {
throw new IllegalArgumentException("array is null or empty.");
}
int result = array[0], mark = 0;
for (int i = 0; i < array.length; i++) {
int element = array[i];
if (mark >= 0) {
mark += element;
} else {
mark = element;
}
if (mark > result) {
result = mark;
}
}
return result;
}
public static void main(String[] args) {
MaxSumOfSubArray maxSumOfSubArray = new MaxSumOfSubArray();
int maxSum = maxSumOfSubArray.maxSum(new int[]{1, -2, 3, 10, -4, 7, 2, -5});
System.out.println(maxSum);
}
}
輸出: 18
其實(shí)雖然原題中指出數(shù)組里有正數(shù)和負(fù)數(shù),當(dāng)時(shí)經(jīng)過實(shí)踐和思考,這個(gè)算法同樣適用于全是正數(shù),或者全是負(fù)數(shù)的情況。當(dāng)全為正數(shù)時(shí),最大的和自然就是所有元素的和,當(dāng)全為負(fù)數(shù)時(shí),最大和自然就是其中最大的那個(gè)負(fù)數(shù)的值。通過此算法都能得到相應(yīng)的結(jié)果。
測試代碼-全是負(fù)數(shù):
public static void main(String[] args) {
MaxSumOfSubArray maxSumOfSubArray = new MaxSumOfSubArray();
int maxSum = maxSumOfSubArray.maxSum(new int[]{-100, -3, -10, -1, -7, -2, -5});
System.out.println(maxSum);
}
輸出 -1
測試代碼-全是正數(shù):
public static void main(String[] args) {
MaxSumOfSubArray maxSumOfSubArray = new MaxSumOfSubArray();
int maxSum = maxSumOfSubArray.maxSum(new int[]{100, 3, 10, 1, 7, 2, 5});
System.out.println(maxSum);
}
輸出 128
3. 總結(jié)
該算法可以適用于任何數(shù)值數(shù)組,和數(shù)組中數(shù)組的正負(fù)無關(guān)。
總結(jié)
以上是生活随笔為你收集整理的java 最大子数组_求一个数组中子数组的最大和算法(Java实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 醋春柴胡的功效与作用、禁忌和食用方法
- 下一篇: mysql引擎测试_MySQL MyIS