题目
来源: 连续数列
给定一个整数数组,找出总和最大的连续数列,并返回总和。
示例
解题思路及代码
1. 思路
总和最大的连续数列停止添加元素,有两种情况,一种是遍历至数组尾,一种是现在数组和小于0,因为若小于0,只会让后面的连续数列的和变小,所以我们会重新选择其下一个元素作为连续数列的开头,同时不断更新连续数列和的最大值(虽然是这么想,但好像觉得这种说法不太有说服力。。)
动态规划:
一开始想了很久,一直想着dp[n]表示以第n个元素作为连续数列第1个元素时的最大和。然后越想思路越混乱。。。
创建dp数组,dp[i]表示以第i个元素结尾的连续子序列的最大和。状态转移方程dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
分治法
任意一个序列,其总和最长的连续序列只有三种情况,出现在数组左边,出现在数组右边,出现在数组中间。
2. 代码
var maxSubArray = function(nums) {
var sum = -Infinity;
var maxSum = -Infinity;
for (let i = 0; i < nums.length; i++) {
if (sum < 0) {
sum = nums[i];
} else {
sum += nums[i];
}
maxSum = Math.max(maxSum, sum);
}
return maxSum;
};
动态规划:
var maxSubArray = function(nums) {
var maxSum = nums[0];
var dp = new Array();
dp[0] = nums[0];
for (let i = 1; i < nums.length; i++) {
dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
maxSum = Math.max(maxSum, dp[i]);
}
return maxSum;
};