题目
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
求一个数组的连续子序列的最大值。
For example, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.
分析+源码
1.遍历得到所有可能的字符串,去结果最好的解,这是最简单的方案,但是比较耗时间。
js
2.类似于dp动态规划来解,知道前K个元素的最大子序列和最大值(已经记录的),以及一个临时的sum.添加k+1这个元素,由于连续子序列这个限制,如果k+1这个元素之前的和小于0,则增加k+1这个元素从而去组成最大子序列没有意义,所以直接可以sum=0。注意一点,只要sum不减到负数,中间出现小于0的元素是没关系的,sum仍然可以继续累加。
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
var sum=maxSum=nums[0];
for(var i=1;i<nums.length;i++){
if(sum<0){
sum=0;
}
sum+=nums[i];
maxSum=Math.max(maxSum,sum);
}
return maxSum;
}
3.思路是【考虑只有子序列的前半部分的和为正数时,子数组的求和才可能最大。】这样遍历一次数组即可。从头开始遍历的元素求和为正,继续向后,求和为负,重新求和,子数组的开始设置为下一个元素。 当数组前面的几个元素加起来mark<0后,把mark重新赋值,置下一个元素,mark=nums[i].当mark>result,更新result=mark,当mark
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
if(nums.length>0){
var result=nums[0];
var mark=0;
}else{
return -Infinity;
}
for(var i=0;i<nums.length;i++){
if(mark>=0){
mark+=nums[i];
}else{
mark=nums[i];
}
if(mark>result){
result=mark;
}
}
return result;
}