所谓最大子数组问题,就是在给定的一串包含正数,负数的数组中,找出最大的子数组的和
例如:
输入:1,-2,3,10,-4,7,2,-5
1.左数组
例如:
输入:1,-2,3,10,-4,7,2,-5
最大子数组和为18
一般而言,有三种办法可以用于解决这个问题
1.暴力破解法
暴力破解法就是将所有的子数组的和全部加起来,取最大的
算法最简单,但是时间复杂度最高
时间复杂度:O(n)=n^3
var sum=-1000;
for (var i=0;i<arr.length;i++) {
//遍历从i开始的所有子数组
for (var j=i;j<arr.length;j++) {
var thisSum=0;
//累计求和
for (var k=i;k<=j;k++) {
thisSum+=arr[k];
}
if (thisSum>sum) {
//记录最大子数组的位置和长度
sum=thisSum
}
}
}
console.log(sum);//sum=18
2.分治法
分治法的核心思想就是将大问题分解为小问题,再将小问题逐个解决,然后从小问题的解得到原问题的解
如果把数组从任一点(一般取中点)分为两个数组,那最大子数组只能存在于三个位置1.左数组