每日刷题 day16-----最大子序和

54 阅读1分钟

leetcode传送门

image.png 思路: 首先这道题最简单暴力的方法就是直接遍历一遍,然后取出最大值,这种方法时间复杂度和空间复杂度都很高

    /**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    let max = []
    for(let i=0;i<nums.length;i++){
        let sum = nums[i]
        let tempMax = nums[i]
        for(let j=i+1;j<nums.length;j++){
            if(sum+nums[j]>tempMax){
                tempMax = sum+nums[j]
            }
            sum = sum +nums[j]
        }
        max.push(tempMax)
    }
    max.sort(function(a,b){return a-b})
    console.log(max)
    return max[max.length-1]
};

思路二:动态规划

状态转换方程就是 dp[i] = Math.max(num[i],dp[i-1]+num[i])

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    let dp = new Array(nums.length).fill(Number.MIN_SAFE_INTEGER)
    console.log(dp)
    let res = nums[0]
    dp[0] = nums[0]
    for(let i=1;i<nums.length;i++){
        dp[i] = Math.max(nums[i],dp[i-1]+nums[i])
        res = Math.max(res,dp[i])
    }
    return res
};