Question:
how do they know Si+Ei is a continuous subarray?
Answer:
cause Si is not a subarray sum , it is the partical sum from 0 to anywhere smaller than i
2. Find the minimum subarray sum, since either min or max will cover the cross over of 0 and N-1,
3. Doing non circular finding subarray sum for 2N array, but need to consider the length
For non circular version:
1. Partial sum - min sum
2. Maximum till i = max (A[i], max till i ) and maximum sum
Code:
int maxSumNonCirular(const vector
{
int Mxtil =0;
int Mx =0;
for (int i=1; i {
Mxtil = max(A[i], A[i]+Mxtil);
Mx = max(Mx, Mxtil);
}
return Mx;
}
int maxCircular(const vector
{
vector
int sum = A.front();
maxBegin.push_back(sum);
for (int i=1; i {
sum+=A[i];
maxBegin.push_back( max (maxBegin.back(), sum));
}
vector
sum =0;
maxEnd.back()=0;
for (int i=A.size()-2; i>=0; --i)
{
sum+=A[i+1];
maxEnd[i] = max( maxEnd[i+1], sum);
}
int cirMax =0;
for (int i=0; i {
cirMax = max(cirMax, maxBegin[i]+maxEnd[i]);
}
return cirMax;
}
int maxSubArrayCircular(const vector
{
return max( maxSumNonCirular(A), maxCircular(A) );
}
No comments:
Post a Comment