Maximum Subarray的通过率居然这么高,我提交了几次都是Wrong Answer,郁闷!
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.
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.
1, 最简单最容易想的办法是两重循环遍历, 不过显然将会是Time Limit Exceeded.
int maxSubArray(int A[], int n) { int max = A[0]; for(int i = 0; i < n; ++i) { int sum = A[i]; for(int j = i + 1; j < n; ++j) { sum += A[j]; if(sum > max) max = sum; } } return max; }
2, 分治法
int recursiveMaxSubArray(int A[], int left, int right) { if(left == right)return A[left]; if(left == right-1)return max(max(A[left], A[right]), A[left]+A[right]); //divide int mid = (left + right)/2; int lmax = recursiveMaxSubArray(A, left, mid-1); int rmax = recursiveMaxSubArray(A, mid+1, right); //the max is [i..mid..j] int mmax = A[mid]; for(int j = mid + 1, sum = mmax; j <= right; ++j) { sum += A[j]; if(sum > mmax) mmax = sum; } for(int j = mid - 1, sum = mmax; j >= left; --j) { sum += A[j]; if(sum > mmax) mmax = sum; } return max(max(lmax, rmax), mmax); } int maxSubArray(int A[], int n) { return recursiveMaxSubArray(A, 0, n-1); }
3, 算法
Kadane‘s algorithm:
containing at least one positive number
Ref.
1, http://en.wikipedia.org/wiki/Maximum_subarray_problem
2, http://blog.csdn.net/joylnwang/article/details/6859677.
Lemma 1: Suppose A[i...j] is the max subarray, then sum(A[i...k]) >= 0, where i <=k < j.
Proof. If sum(A[i...k]) < 0, then sum(A[k+1...j]) > sum(A[i...j]), contradiction.
int maxSubArray(int A[], int n) { int max = A[0], sum = 0; for(int i = 0; i < n; ++i) { sum += A[i]; if(sum > max) max = sum; if(sum <= 0) sum = 0; } return max; }
LeetCode之Maximum Subarray