Maximum Subarray
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.
数据结构书上的经典题,甚至是引言中的题目。不细说。
O(N)算法
class Solution {
public:
int maxSubArray(int A[], int n) {
int sum = A[0];
int biggest = A[0];
for(int i = 1; i < n; i++){
if(sum < 0){
sum = A[i];
}
else{
sum += A[i];
}
biggest = biggest < sum? sum: biggest;
}
return biggest;
}
};
O(nlogn)算法
class Solution {
public:
int maxSubArray(int A[], int n) {
return _maxSubArray(A, 0, n);
}
//[left, right)
int _maxSubArray(int A[], int left, int right){
//base case
if(right - left == 1){
return A[left];
}
int mid = (left + right) / 2;
int a = _maxSubArray(A, left, mid);
int b = _maxSubArray(A, mid, right);
int maxLeftAdjacent = 0;
int maxRightAdjacent = 0;
int sum = 0;
for(int i = mid - 1; i >=left; i--){
if(i == mid - 1) maxLeftAdjacent = A[i];
sum += A[i];
maxLeftAdjacent = sum > maxLeftAdjacent? sum: maxLeftAdjacent;
}
sum = 0;
for(int i = mid; i < right; i++){
if(i == mid) maxRightAdjacent = A[i];
sum +=A[i];
maxRightAdjacent = sum > maxRightAdjacent? sum: maxRightAdjacent;
}
return max(max(a,b),maxLeftAdjacent + maxRightAdjacent);
}
};
