陣列最大子串行和問題

2021-06-08 22:20:46 字數 1009 閱讀 4458

問題描述:最大子串行

給定一整數序列a1, a2,... an (可能有負數),求a1~an的乙個子串行ai~aj,使得ai到aj的和最大。

例如: 整數序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子串行的和為21,子串行起始下標為1,結束下標為8。 

複雜度:o(n)

// return 子串行最大和,start 為子串行的開始下標,end為子串行的結束下標

public int maxsub(int a)

firstflag = true;

} else if (tempsum < 0)

}} system.out.println("size=" + size + " start =" + start + " end="

+ end + " sub length=" + (end - start + 1));

return max;

}

備註:經測試了十幾組資料,子串行起始下標正確,但不排除特殊情況。

可如此解決:用maxsum(子串行和)從end下標向前減a[ end--],直至=0,可得出起始下標。

原理:(摘自網路)

1 當sum(i, j)<0時,sum(i, j),sum(i, j+1),sum(i, j+2)...sum(i, n)都不可能是最大值。

2 由1可知,最優子串行不可能以負數開頭。

3 若sum(i, j),sum(i, j+1),sum(i, j+2)...sum(i, n)都不為負數,則以a[i+1]...a[n]開頭的子串行和都不可能最大。

因而,演算法變為:從左到右的一次掃瞄,不斷累加,並更新最大值,當累加a[j]時值為負,則累加值清零,開始從

a[j+1]

累加。

最大子串行和問題

問題 給定一整數序列a1,a2,an 可能有負數 求a1 an的乙個子串行ai aj,使得ai到aj的和最大 例如 整數序列 2,11,4,13,5,2,5,3,12,9的最大子串行的和為21。對於這個問題,最簡單也是最容易想到的那就是窮舉所有子串行的方法。利用三重迴圈,依次求出所有子串行的和然後取...

最大子串行和問題

問題描述 給定乙個整數序列 可能有負數 求一子串行 記為l 使得該子串行所有元素之和最大。例 給定序列 2,11,4,13,5,2,則最大子串行和為20 11,4,13 方法一 遍歷窮舉 o n 2 略方法二 分治遞迴 o n logn 思路 將輸入序列l分為左右兩個子串行l1和l2,則l 只可能以...

最大子串行和問題

問題描述 求 2,11,4,13,5,2 的最大子串行和。方法一 使用3層for迴圈巢狀,窮舉式的嘗試所有的可能,如下 public class demo1 return maxsum public static void main string args system.out.println 最大...