Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array
the contiguous subarray
[−2,1,−3,4,−1,2,1,−5,4]
,the contiguous subarray
[4,−1,2,1]
has the largest sum = 6
.
More practice:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
This problem took me 2 hours to finish. At first, I was thinking this in a DP way, but failed. Then I used two pointers: start and end. The key is when to move start and when to move end.
1. when the current sum value <= 0, move start. 1) if end is positive, move start to end, else move start to end+1.
2. when current sum value > 0, keep start and move end backwards, as this sub-array would give positive contribution.
My Code :
int maxSubArray(int A[], int n) { int s = 0, e = 0; int curval = 0, maxval = INT_MIN; int maxs = 0, maxe = 0; while(e < n){ curval = curval + A[e]; if(curval > maxval){ maxval = curval; maxs = s; maxe = e; } if(curval < 0){ if(A[e] > 0){ s = e; e = s; } else{ s = e + 1; e = s; } curval = 0; } else { e = e + 1; } } return maxval; }
=============However, the divide and conquer result is still not finished!=======
No comments:
Post a Comment