首页 > 代码库 > leetcode 53. Maximum Subarray

leetcode 53. Maximum Subarray

leetcode 53. 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.

 

一个有N个整数元素的一维数组(A[0],A[1],A[2],...A[n-1]),这个数组中当然有很多子数组,那么子数组之和的最大值是多少?

该子数组是连续的。

我们先来明确一下题意:

(1)子数组意味着是连续的。

(2)题目只需要求和,并不需要返回子数组的具体位置。

(3)数组的元素是整数,所以数组可能包含正整数,负整数或者零。

 

方法1: 穷举法

class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum=0;
int maxSum=0;
for(int i = 0;i < nums.size();i++){
sum = 0;
for(int j = i;j < nums.size();j++){
sum += nums[j];
maxSum = max(maxSum,sum);
}
}
return maxSum;
}
};

方法2:DP

每次在前子串加一个元素时,看结果是不是比新元素小,如果小说明前子串已经是负的了,就可以舍弃掉,重新开始。

 遇到一个数有两种选择 (1)加入之前subArray (2)自己另起一个subArray
设状态S[i], 表示以A[i]结尾的最大连续子序列和,状态转移方程如下:

S[i] = max(S[i-1] + A[i],A[i])

 

 

class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum=0;
int S[nums.size()];
int maxSum = nums[0];
S[0] = nums[0];
for(int i = 1;i < nums.size();i++){
S[i] = max(S[i-1] + nums[i],nums[i]);
if(S[i] > maxSum){
maxSum = S[i];
}
}
return maxSum;
}
};

 

 

方法3: DP

每次判断时只需要知道他的前字串值就ok了,没必要记录子串值,可以去掉S数组

 

class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum=0;
int maxSum = nums[0];
int last=nums[0]; 
for(int i = 1;i < nums.size();i++){
last +=nums[i];
last = max(last,nums[i]);
if(last > maxSum){
maxSum = last;
}
}
return maxSum;
}
};

 

leetcode 53. Maximum Subarray