前端算法(42)

71 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

题目解析

思路一

首先我们可以确定的是nums数组长度只有1的时候,那最大值就为nums[0],那再添加一位的时候,那最大值就是Math.max(nums[0]+nums[1],nums[0]),所以以此类推,我们声明一个保存每一位最大值的数组,然后返回这个数组的最大值,就是nums的最大子序和

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    var dp = []
    dp[0] = nums[0]
    var max = dp[0]
    for(var i =1;i<nums.length;i++){
       //求以nums[i]为结尾的最大值
        dp[i] = Math.max(nums[i],dp[i-1]+nums[i])
        // 更新最大值
        max = Math.max(dp[i],max)
    }
    return max
};

思路二

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function (nums) {
    // res 表示以一个数结尾的子数组的最大和
    let res = nums[0], 
    // 以上一个数字结尾的子数组的和
    sum = 0
    for (let x of nums) {
        // 如果以上一个数字结尾的子数组的和>0, 则以当前数字结尾的和最大的子数组包含上一个子数组或数字
        // 相当于 2 3 5 以3结尾的和最大的子数组一定包含2,因为 2 > 0
        if (sum > 0) sum += x
        // 如果以上一个数字结尾的子数组的和<=0,则以当前数字结尾的和最大的子数组一定不包含上一个子数组或数字
        else sum = x
        // 对以每个数字结尾的和最大的子数组再求一个最终的最大值,作为原数组的和最大的子数组
        res = Math.max(res, sum)
    }
    //返回
    return res
};