给你一个整数数组
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)