题目
输入一组整数,例如:[-23, 17, -7, 11, -2, 1, -34, 2, -21, 9, 12]
,求出子序列的最大和
实现1
先尝试一种最暴力的方法,求最大子串,那么就将所有的子串计算出来,然后从中选出最大的
const getMax = arr => {
let result = [];
let temp;
for (let i = 0; i < arr.length; i++) {
temp = 0;
for (let j = i; j < arr.length; j++) {
temp += arr[j];
result.push(temp)
}
}
return Math.max(...result)
};
实现2
可以对上面的方法进行优化,没有必要将所有的子串都保存起来,在计算过程中就可以实时的比较当前的最大值,最终返回的也是这个最大值
const getMax = arr => {
console.time('getMax');
let max = arr[0];
let temp;
for (let i = 0; i < arr.length; i++) {
temp = 0;
for (let j = i; j < arr.length; j++) {
temp += arr[j];
max = Math.max(max, temp)
}
}
return max
};
这种解法的时间复杂度为O(n²)
实现3
实际上这是一道动态规划题目,以我对动态规划浅显的理解,就是从已有的状态中,推测下一状态的最优解。
要计算最优解,我们假设计算到的序列是i
,这之前的子串和是temp
,同时保存