13.最大子数组和

89 阅读1分钟

题目链接

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

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

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]

输出:6

解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

解法1 暴力解法

思路

求子数组的最大和,第一层遍历起点,第二层遍历终点,同时用变量累加,并和当前最大值做比较。

代码

var maxSubArray = function(nums) {
    let result = -Infinity;

    for (let i = 0; i < nums.length; i++) {
        let currSum = 0;
        for (let j = i; j < nums.length; j++) {
            currSum += nums[j];
            result = Math.max(result, currSum);
        }
    }
    return result;
};

时空复杂度分析

时间复杂度:O(n^2),这个会超时

空间复杂度:O(1) 只有两个额外变量

解法2 动态规划

代码

function maxSubArray(nums: number[]): number {
    let pre = 0; // 当前子数组和的最大值
    let result = nums[0];
    nums.forEach(x => {
        // 如果当前元素 x 本身更大,就抛弃之前的累加值,从当前元素重新开始子数组。
        pre = Math.max(pre + x, x);
        result = Math.max(result, pre);
    })
    return result;
};

时空复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)