//one dimension dp
public int maxSubArray(int[] A) {
// Start typing your Java solution below
// DO NOT write main() function
int max = 0;
int result = Integer.MIN_VALUE;
for(int i = 0; i < A.length; i++) {
max += A[i];
result = Math.max(max, result);
max = max > 0 ? max : 0;
}
return result;
}
//divide and conquer
//three cases, max totally in the left, totally in the right, between left and right
public int maxSubArray(int[] A) {
// Start typing your Java solution below
// DO NOT write main() function
return maxSubArray(A, 0, A.length - 1, Integer.MIN_VALUE);
}
public int maxSubArray(int[] A, int start, int end, int max) {
if(start > end) return Integer.MIN_VALUE;//attention here, not return 0
int middle = start + (end - start) / 2;
int left = maxSubArray(A, start, middle - 1, max);
max = Math.max(left, max);
int right = maxSubArray(A, middle + 1, end, max);
max = Math.max(right, max);
int sum = 0;
left = 0;
for(int i = middle - 1; i >= start; i--) {
sum += A[i];
left = Math.max(left, sum);
}
sum = 0;
right = 0;
for(int i = middle + 1; i <= end; i++) {
sum += A[i];
right = Math.max(right, sum);
}
max = Math.max(max, left + right + A[middle]);
return max;
}
Maximum Subarray
最新推荐文章于 2019-07-03 04:34:57 发布