Given an integer array, find the max sum in any contiguous sub-array. If all elements are negative, then the sum is 0. The following code just finds the max sum without returning the start and end indexes:
public class MaxSubArray {The following code returns max sum with starting and ending indexes. If all elements are negative, return start and end indexes as 0 and -1, respectively.
public static int maxSum(int[] input) {
int currentSum = 0;
int maxSum = 0;
for (int i = 0; i < input.length; i++) {
currentSum = Math.max(currentSum + input[i], 0);
maxSum = Math.max(maxSum, currentSum);
}
return maxSum;
}
}
public class MaxSubArray {The run time for both method is linear (O(n)).
public static MaxSubArrayResult compute(int[] input) {
MaxSubArrayResult result = new MaxSubArrayResult(0, -1, 0);
int currentSum = 0;
int currentStart = 0;
for (int currentEnd = 0; currentEnd < input.length; currentEnd++) {
currentSum += input[currentEnd];
if (currentSum > result.maxSum) {
result.start = currentStart;
result.end = currentEnd;
result.maxSum = currentSum;
} else if (currentSum < 0){
currentStart = currentEnd+ 1;
currentSum = 0;
}
}
return result;
}
public static class MaxSubArrayResult {
public int start;
public int end;
public int maxSum;
public MaxSubArrayResult(int start, int end, int sum) {
super();
this.start = start;
this.end = end;
this.maxSum = sum;
}
@Override
public String toString() {
return String.format("start = %d, end = %d, maxSum = %d", start, end, maxSum);
}
}
}
No comments:
Post a Comment