首页 > 其他 > 详细

leetcode 53. Maximum Subarray

时间:2017-07-03 11:21:40      阅读:175      评论:0      收藏:0      [点我收藏+]

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

原文:http://www.cnblogs.com/sure0328/p/7109905.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!