比如数组:
var arr = [1,4,7,-33,15,-10,-4,100,-120,121];
最后打印出来的是子数组[121] 所有元素的值的和,值为: 121
算法如下:
function add(arr,i,k){
var sum =0;
for(var j =i; j<=k ;j++){
sum = sum+arr[j];
}
return sum;
}
function A(arr){
var len = arr.length;
var max = arr[0];
for(var i=0;i<len;i++){
for(var j=i;j<len;j++){
var s = add(arr,i,j);
if(s>max) max = s;
}
}
return max;
}
//最后值为: 121;
实现过程:
1. 先写一个求一个数组从第j个元素到第k个元素和的函数,最后返回这个和.
2.从第一个元素开始,求出第一二个元素,一二三个元素,一二三四个元素的和,其余类推。比如上面中先求出1 ; 1,4 ; 1,4,7 ; 1,4,7,-33 ; 1,4,7,-33,15; 1,4,7,-33,15,-10;
1,4,7,-33,15,-10,-4 ; 1,4,7,33,15,-10,-4,100; 1,4,7,33,15,-10,-4,100,-120 ; 1,4,7,33,15,-10,-4,100,-120 ,121;第一层的第一次循环结束,求出这些组中最大的值,保存到max中。
3.第一层的第二次循环从第二个元素开始,比如:
4 ; 4,7 ; 4,7,-33 ; 4,7,-33,15; 4,7,-33,15,-10;
4,7,-33,15,-10,-4 ; 4,7,33,15,-10,-4,100; 4,7,33,15,-10,-4,100,-120 ; 4,7,33,15,-10,-4,100,-120 ,121;邱春这些所有的值,和max比较,使max始终有最大的值.
4.按照2,3步骤类似一直到最后一个元素,每次求值后都和max比较大小,如果比max大,替换max值( var s = add(arr,i,j); if(s>max) max = s; )比如这两行代码,最后把所有子数列都枚举了,得到最大的子数列和。