【leetcode】53. Maximum Subarray

来源:互联网 发布:社交网络中文 编辑:程序博客网 时间:2024/06/11 02:36

题目

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; }
0 0
原创粉丝点击