【C++】陣列中連續子陣列的最大和
阿新 • • 發佈:2019-01-22
題意: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;
}