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
.
class Solution {
public:
/*algorithm divide and conquer
A[1..n] can divide to A[1..i-1] A[i] A[i+1..n]
f(1..n) = max(f(1..i-1),f(i+1...n),union(f(1..i-1)+A[i]+f(i+1..n))
time O(nlogn) space O(nlogn)
*/
//[start,end)
int maxSubArrayHelper(vector<int>&nums,int start,int end)
{
if((end - start) < 1)return INT_MIN;
if((end-start) < 2)return nums[start];
int mid = start + (end-start)/2;
int left = maxSubArrayHelper(nums,start,mid);
int right = maxSubArrayHelper(nums,mid+1,end);
int lsum = 0,lsmax=0;
for(int k=mid-1;k >= start;k--){
lsum += nums[k];
lsmax = max(lsmax,lsum);
}
int rsum = 0,rsmax=0;
for(int k=mid+1;k < end;k++){
rsum += nums[k];
rsmax = max(rsum,rsmax);
}
return max(max(left,right),lsmax+nums[mid]+rsmax);
}
int maxSubArray(vector<int>& nums) {
return maxSubArrayHelper(nums,0,nums.size());
}
};
class Solution {
public:
/*algorithm dp solution
for array,A[1...n]
f(1)=A[1];
f(2)=max(f(1) + A[2],A[2])
f(n) = max(f(n-1) + A[n],A[n])
time O(n) space O(1)
*/
int maxSubArray(vector<int>& nums) {
int n = nums.size();
int gmax = nums[0];
int f0 = nums[0],f1;
for(int i = 1;i < n;i++){
f1 = max(f0+nums[i],nums[i]);
f0 = f1;
gmax = max(gmax,f0);
}
return gmax;
}
};