53. 最大子数组和
    image.png
    思路分析:
    f(i)表示以 arr[i]结尾的连续子数组的最大和,则可以得到动态转移方程
    f(i+1) = Math.max( f(i)+nums[i], nums[i] )
    f(0) = -2是确定的初始条件
    初始解法1:把所有f(i)放到数组里,返回最大值,空间复杂度较高O(n)

    1. var maxSubArray = function(nums) {
    2. let arr = []
    3. let pre = 0
    4. for(let i=0; i< nums.length;i++){
    5. pre = Math.max(nums[i]+pre, nums[i])
    6. arr.push(pre)
    7. }
    8. return Math.max(...arr)
    9. };

    进阶解法2:在解法1的思想上,用一个变量记录生成过的f(i)的最大值,遍历完了,最大值就出来了,
    空间复杂度较低O(1)

    1. var maxSubArray = function(nums) {
    2. let pre = 0
    3. let max = nums[0]
    4. nums.forEach(num => {
    5. pre = Math.max(pre+num, num)
    6. max = Math.max(max, pre)
    7. })
    8. return max
    9. };