[LeetCode][JavaScript]Maximum Subarray

Maximum Subarray

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.

https://leetcode.com/problems/maximum-subarray/

 

 


 

 

找出和最大的子串。

动态规划 ,维护一个变量previous,记录之前的最大值。

当前的最大值就是Math.max(previous + nums[i], nums[i])。

 

 1 /**
 2  * @param {number[]} nums
 3  * @return {number}
 4  */
 5 var maxSubArray = function(nums) {
 6     if(nums.length === 0) return 0;
 7     var previous = Math.max(0, nums[0]), max = nums[0];
 8     for(var i = 1; i < nums.length; i++){
 9         previous = Math.max(previous + nums[i], nums[i]);
10         max = Math.max(previous, max);
11     }
12     return max;
13 };

 

 

一开始写的比较啰嗦。

动态规划,到当前index的子串的最大值可能有三种情况:

1. 当前元素的,nums[i]

2. nums[i] + 包括了上一个元素nums[i - 1]的最大子串的和

3. nums[i] + 上一个元素nums[i - 1]之前的最大值(不包括nums[i - 1]) + nums[i - 1]

 

 1 /**
 2  * @param {number[]} nums
 3  * @return {number}
 4  */
 5 var maxSubArray = function(nums) {
 6     if(nums.length === 0) return 0;
 7     var dp = [], max = nums[0], previous, current;
 8     dp[0] = {previous : 0, current: nums[0]};
 9     for(var i = 1; i < nums.length; i++){
10         previous = dp[i - 1].current;
11         current = Math.max(nums[i], nums[i] + dp[i - 1].current,
12             nums[i] + nums[i - 1] + dp[i - 1].previous);
13         dp[i] = {previous : previous, current: current};
14         max = Math.max(current, max);
15     }
16     return max;
17 };

 

 

posted @ 2016-03-27 22:28  `Liok  阅读(726)  评论(0编辑  收藏  举报