您的位置:首页 > 编程语言 > C语言/C++

leetcode_Maximum Subarray _medium(最大子数组的和)

2015-09-05 10:58 429 查看
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
.

参考了编程之美2.14的方法。

1.i,j 两层循环(通过最里边求和时的技巧,减少了最里边求和的重复计算,但复杂度为O(n*n)

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


下面的,再次减少重复计算,但是复杂度也是O(n^2)

class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max=0,len=nums.size();
vector<int> iVec(len,0);
iVec[0]=nums[0];
for(int j=1; j<len; j++)
{
iVec[j]=iVec[j-1]+nums[j];
if(iVec[j]>max)
max=iVec[j];
}

for(int i=1; i<len; i++)
{
for(int j=i; j<len; j++)
{
iVec[j]-=nums[i-1];
if(iVec[j]>max)
max=iVec[j];
}
}
return max;
}
};


2.受到分治方法的启发,利用动态规划的方法,复杂度为O(n)

class Solution {
public:
inline int myMax(int a,int b)
{
return a>b?a:b;
}
int maxSubArray(vector<int>& nums) {
int n=nums.size();
int iAll=nums[n-1],iStart=nums[n-1];
for(int i=n-2; i>=0; i--)
{
//动态规划
iStart=myMax(nums[i],nums[i]+iStart);
iAll=myMax(iStart,iAll);
}
return iAll;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息