-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMaximumSubArraySumDAndC.java
More file actions
61 lines (47 loc) · 2 KB
/
MaximumSubArraySumDAndC.java
File metadata and controls
61 lines (47 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// time complexity of this algorithm is as same as merge sort i.e, 0(n * log n)
// Divide & Conquer algorithm
public class MaximumSubArraySumDAndC {
public static void main(String[] args) {
int [] arr = {-1, 7, 3,-6, 3, -2, -7, 12};
int N = arr.length;
int maxSum = maximumSubArraySum(arr,0, N-1);
System.out.println("Maximum contiguous sum is: " + maxSum);
}
private static int maximumSubArraySum(int[] inputArray, int left, int right) {
//invalid range
if(left > right)
return Integer.MAX_VALUE;
// Base case: when there's only 1 element
if(left == right)
return inputArray[left];
int middle = (left + right) / 2;
/*
Return maximum of 3 of the following possible cases:
1. Maximum sub-array sum in left half.
2. Maximum sub-array sum in right half.
3. Maximum sub-array sum such that the sub-array crosses the midpoint.
*/
return Math.max(Math.max(maximumSubArraySum(inputArray,left,middle), maximumSubArraySum(inputArray,middle+1,right)),
maxCrossingSum(inputArray,left,middle,right));
}
private static int maxCrossingSum(int[] inputArray, int left, int middle, int right) {
//includes elements on left of middle.
int sum = 0;
int leftSum = Integer.MIN_VALUE;
for (int i = middle; i >= left; i--) {
sum += inputArray[i];
if(sum > leftSum)
leftSum = sum;
}
// includes elements from middle to right end
sum = 0;
int rightSum = Integer.MIN_VALUE;
for (int i = middle; i <= right; i++) {
sum += inputArray[i];
if(sum > rightSum)
rightSum = sum;
}
// Since inputArray[middle] is already added twice i.e,in rightSum and leftSum. So, it is subtracted 1 time.
return Math.max(leftSum + rightSum - inputArray[middle], Math.max(leftSum, rightSum));
}
}