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;
}
};
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;
}
};