剣指offer-JZ 30-連続サブ配列の最大和
1030 ワード
タイトルの説明
HZはたまに専門的な問題を持って非コンピュータ専門の同級生をからかっている.今日のテストグループの会議が終わった後、彼はまた話をしました:古い1次元モードの識別の中で、いつも連続するサブベクトルの最大和を計算する必要があって、ベクトルがすべて正数の時、問題はとてもよく解決します.しかし、ベクトルに負の数が含まれている場合、ある負の数を含んで、隣の正の数が補うことを期待しますか?例えば,{6,−3,−2,7,−15,1,2,2},連続サブベクトルの最大和は8(0番目から3番目まで)である.配列をあげて、その最大連続サブシーケンスの和を返して、あなたは彼にだまされませんか?(サブベクトルの長さは少なくとも1)
考え方:
動的計画入門では、f(i)を最初のi要素の最大和とし、f(i)=max(f(i-1)+array[i],array[i])、前のi要素の最大和は前のi-1要素の最大と、i番目の要素と現在の要素の両方の最大値を加えます.
C++
HZはたまに専門的な問題を持って非コンピュータ専門の同級生をからかっている.今日のテストグループの会議が終わった後、彼はまた話をしました:古い1次元モードの識別の中で、いつも連続するサブベクトルの最大和を計算する必要があって、ベクトルがすべて正数の時、問題はとてもよく解決します.しかし、ベクトルに負の数が含まれている場合、ある負の数を含んで、隣の正の数が補うことを期待しますか?例えば,{6,−3,−2,7,−15,1,2,2},連続サブベクトルの最大和は8(0番目から3番目まで)である.配列をあげて、その最大連続サブシーケンスの和を返して、あなたは彼にだまされませんか?(サブベクトルの長さは少なくとも1)
考え方:
動的計画入門では、f(i)を最初のi要素の最大和とし、f(i)=max(f(i-1)+array[i],array[i])、前のi要素の最大和は前のi-1要素の最大と、i番目の要素と現在の要素の両方の最大値を加えます.
C++
class Solution {
public:
int FindGreatestSumOfSubArray(vector array) {
int n = array.size();
if(n == 0)
return 0;
//dp[i] = max(dp[i-1]+array[i],array[i])
//maxSum = max(curSum, maxSum)
int curSum = 0;
int maxSum = 0x80000000;//
for(int i = 0; i < n; ++i){
if(curSum <= 0)//
curSum = array[i];
else
curSum += array[i];
maxSum = max(maxSum, curSum);
}
return maxSum;
}
};