整体的动态规划的思路就是 保留之前算好的最大子串,即每到一个元素,就已经确定好了当前元素之前的最大子串和,就要看后面的新元素能否让前面的最大子串和发生变化,变得更大
let nums = [5,-1,2,-4,1,-2,2]
// 有注释版
function getMaxNum(nums){
let start = 0; //标记最大子串和的子串起点下标
let end = 0; //标记最大子串和的子串结束点下标
let sum = nums[0]; //初始化第一个元素记为最大值
let n = nums[0]; //n代表当前前面的数据和的情况(临时值),刚开始的子串和默认为第一个元素
for(let i=1; i<nums.length; i++) {
// console.log("n="+n, " nums["+i+"]="+nums[i]," sum="+sum)
let flag = true;//是否改变start的值
if( n>0 ) { //如果n是大于0的,和当前元素nums[i]相加之后不会变小,所以给他们相加
n = n + nums[i];
flag=false
}else{
// 如果n是小于等于0的,相加后只会更小或不变,所以,
// 将当前元素直接赋值给n,表示从nums[i]重新开始统计子串和,
// 下面判断了n和sum的大小之后,如果重新赋值给sum,则start也会变为i
n = nums[i];
}
// console.log("判断后的n",n)
if( n>sum ) {
sum = n;
if(flag){ start = i;}//如果sum值变了,且上一个n是小于0的,则重新给start值
end = i; //如果sum值变了,则重新记录end值
}
// console.log("sum="+sum, " start=",start, " end=",end)
// console.log("---------------------------------")
}
console.log("sum="+sum, start,end)
return sum;
}
function getMaxNum_simple(nums){
let start = 0;
let end = 0;
let sum = nums[0];
let temp = nums[0];
for(let i=1;i<nums.length;i++){
let flag = false;
if(temp>0){
temp=temp+nums[i];
}else{
temp = nums[i];
flag=true;
}
if(temp>sum){
sum=temp;
end=i;
if(flag){ start=i }
}
}
console.log(sum,start,end);
}
getMaxNum(nums);
getMaxNum_simple(nums)