这题要求最值,首先应该想到的就是动态规划,动态规划擅长解决这类问题。
第一种方法:数组的元素依次相加,如果和大于0则可以继续向后加,因为前面的值为正值是可以对后面的求和有正向作用。一旦小于0了,则应该放弃这个sum
。在这个过程中一直记录最大值。
第二种方法:动态规划。难点就在于如何定义状态?如果dp[n]
表示第n
个位置的最大和,那么将无法设计状态转移方程,因为前一个状态没有好的办法转移到新的状态。
这里的技巧就在于用 dp[n]
表示以第n
个数字结尾的最长连续子数组的最大和,这样前后两个状态就可以连续起来。那么最终结果就是遍历 dp
数组获得其中的最大值就是答案。
状态转移方程:dp[n] = Math.max(array[n], dp[n - 1] + array[n]);
public class Solution {
private int one(int[] array) {
int max = Integer.MIN_VALUE;
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
if (sum > 0) {
if (sum > max) {
max = sum;
}
} else {
sum = 0;
if (array[i] > max) {
max = array[i];
}
}
}
return max;
}
public int FindGreatestSumOfSubArray(int[] array) {
int[] dp = new int[array.length];
dp[0] = array[0];
int max = dp[0];
// dp[n] 表示以第n个值结尾的连续数组最大值
for (int n = 1; n < array.length; n++) {
dp[n] = Math.max(array[n], dp[n - 1] + array[n]);
max = Math.max(max, dp[n]);
}
return max;
}
}