题目
{6, -3, -2, 7, -15, 1, 2, 2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。
思路
- dp[i] 表示以i结尾的连续子数组的最大和(连续子数组的结尾是i)
- dp[i] = dp[i - 1] + array[i],dp[i - 1] > 0
- dp[i] = array[i],dp[i] <= 0
- max存储在遍历过程中出现过的最大和
public int FindGreatestSumOfSubArray(int[] array) {
int[]dp = new int[array.length];
dp[0] = array[0];
int max = Integer.MIN_VALUE;
for (int i = 1; i < array.length; i++) {
dp[i] = dp[i - 1] > 0 ? dp[i - 1] + array[i] : array[i];
if (dp[i] > max) {
max = dp[i];
}
}
return max;
}
优化
- dp[]数组,在使用过程中,只用到了dp[i - 1],可以只使用一个变量存储即可。
public int FindGreatestSumOfSubArray(int[] array) {
int sum = array[0];
int max = Integer.MIN_VALUE;
for (int i = 1; i < array.length; i++) {
sum = sum > 0 ? sum + array[i] : array[i];
if (sum > max) {
max = sum;
}
}
return max;
}