leetcode 53. Maximum Subarray

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 53. Maximum Subarray

leetcode 53. Maximum Subarray

Leetcode 53 Maximum Subarray

41. leetcode 53. Maximum Subarray

Leetcode53 Maximum Subarray

LeetCode练题——53. Maximum Subarray