题意: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.
计算数组中连续子数组的最大和。
方法一:使用数组index作为辅助数组。index[i]表示的是从0到i的连续子数组的最大值。
在计算index[i]的时候逐步遍历元素i到0的数据,使他们相加,子相加的过程如果有和大于index[i]的就将值赋值给index[i]。
代码如下所示:
int GetMaxSumLength(vector<int> num){
if(num.size()==0)
return 0;
vector<int> index(num.size(),0);
for(int i=0;i<num.size();++i){
index[i]=num[i];
int tempSum=index[i];
for(int j=i-1;j>=0;j--){
tempSum+=num[j];
if(tempSum>index[i])
index[i]=tempSum;
}
}
int result =num[0];
for(auto &v: index){
cout<<v<<" ";
if(v>result)
result=v;
}
return result;
}
不得不说这个很二逼的做法,时间复杂度应该是O(n*n),不过贵在其思想,有很多动态规划的时候就是这么来的:使用一个额外空间(如index[]),而index[i]就表示的是从0到i的某个状态,而且要无后效性(一个逼格很高的词,意思就是尽量减少前面数据对于后面数据的影响),最后通过某种递推的方式得到最有的解。
下面是对上述代码的改进:
方法二:思路与方法一基本相同。只是在计算index[i]的时候有所不同。若index[i-1]是负值,则index[i]不变,否则index[i]为index[i-1]+index[i];
int GetMaxSumLength2(vector<int> num){
if(num.size()==0)
return 0;
vector<int> index(num.size(),0);
index[0]=num[0];
for(int i=1;i<num.size();++i){
index[i]=num[i];
if(index[i-1]>0)
index[i]+=index[i-1];
}
int result =num[0];
for(auto &v: index){
cout<<v<<" ";
if(v>result)
result=v;
}
return result;
}