給定整數數組(含正負數),找出連續子數組最大和。Kadane 算法 O(n) 掃描一次即得最優解,屬於動態規劃思想。
currentSum(以當前元素結尾的最大子數組和)與 maxSum(全局最大和)。currentSum = max(num, currentSum + num);maxSum = max(maxSum, currentSum)。sum += a[i]; if (sum > max) max = sum; if (sum < 0) sum = 0;。package ketang;
import java.util.Scanner;
public class ArrayMax {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("輸入數組長度: ");
int n = sc.nextInt();
int[] a = new int[n];
System.out.println("輸入數組元素:");
for (int i = 0; i < n; i++) a[i] = sc.nextInt();
int sum = 0, max = a[0];
for (int v : a) {
sum += v;
if (sum > max) max = sum;
if (sum < 0) sum = 0;
}
System.out.println("最大子數組和為 " + max);
}
}
| 輸入數組 | 最大子數組 | 輸出 |
|---|---|---|
1 -2 3 10 -4 7 2 -5 | 3 10 -4 7 2 | 18 |
-2 -3 -1 -4 | -1 | -1 |
5 4 -1 7 8 | 5 4 -1 7 8 | 23 |

int start = 0, end = 0, tempStart = 0;
for (int i = 0; i < n; i++) {
sum += a[i];
if (sum > max) { max = sum; start = tempStart; end = i; }
if (sum < 0) { sum = 0; tempStart = i + 1; }
}
System.out.println("區間 [" + start + ", " + end + "]");