题目:输入一个整型数组,数组里有正数也有负数,数组的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值
思路:
- 使用穷举法,把所有的可能列出来
- 举例分析规律
- 如果累加时发现累加到了一个负数,数字越来越小,则把之前的数存起来,他可能是一个最大值。
- 如果累加的和变成了负数,那么应该把这次的和去掉,换一个头
let arr = [1,2,3,-2,5];
const findMax = arr => {
if(!Array.isArray(arr) || arr.length === 0 ){
//鲁棒性,检测输入数据的正确性
return false;
}
let sum = 0;
let lastSum = -1;
for(var i = 0; i<arr.length; i++){
//理应当检测数组元素的类型,因为懒
if(sum<=0){
sum = arr[i]
}else{
sum+=arr[i];
}
if(sum > lastSum){
lastSum = sum;
}
}
return lastSum;
}
延伸:如果数组为循环数组,即尾部接着头部
思路:循环我们可以构建新数组,长度为原数组两倍,再次调用findMax函数
const findMax2 = arr => {
return findMax([...arr,...arr]);
}