日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java 最大子数组_求一个数组中子数组的最大和算法(Java实现)

發(fā)布時(shí)間:2024/9/19 java 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 最大子数组_求一个数组中子数组的最大和算法(Java实现) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前幾天在微信訂閱號“待字閨中”中看到的一篇文章《小技巧求一個(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。