- 递归 dp 代表 以i结尾的 连续数组的最大值 注意区别 题目问的是当前数组的 连续数组的最大值
dp代表 以这个点结尾的 连续数组的最大值
然后通过比较 每个点的 dp 选出当前数组的最大
相当于获得了 每个点 以这个点结尾向前的连续数组的最大值 dp[i]
dp和前一个点有关 如果前一个点的dp>0 那么必然dp = dp + nums[i] 因为需要当前点结尾
如果 dp < 0 那么说明之前的都没有用 那么只需要 dp = num[i] 就行了
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
int dp = 0;
int res = array[0];
for(int i =0; i<array.length; i++){
//dp = Math.max(dp+array[i],array[i]);
if(dp > 0) dp = dp+array[i];
else {dp = array[i];}
res = Math.max(res,dp);
}
return res;
}
}2.
思想就是如果 该数之前的和 加这个数小于零, 那么之前的都不能加入到最大和的数组中。
但是这样会导致后面为负值 知道大于0 就还会继续加 因此需要Math.max(res,temp);
例如 【100,-1,-2,-3,-4】 这样temp最后会等于90 因此 还需要保存之前的最大值
同时 如果全部小于0 最后的值为0 因此需要判断 if(max_num < 0) return max_num
不如动态规划直接
public class Solution {
public int FindGreatestSumOfSubArray(int[] array) {
int temp = 0;
int max_num = Integer.MIN_VALUE;
int res = 0;
for(int i =0;i<array.length; i++){
if(temp + array[i] < 0) temp = 0;
else{temp = temp + array[i];}
res = Math.max(res,temp);
max_num = Math.max(max_num,array[i]);
}
if(max_num < 0) return max_num;
else return res;
}
}


京公网安备 11010502036488号