forked from architsingla13/InterviewBit-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMaxSumContiguous.java
More file actions
69 lines (59 loc) · 1.6 KB
/
MaxSumContiguous.java
File metadata and controls
69 lines (59 loc) · 1.6 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
62
63
64
65
66
67
68
69
package Array;
import java.util.LinkedList;
import java.util.List;
/**
* Author - archit.s
* Date - 19/08/18
* Time - 4:42 PM
*/
// Proof:-
// Let us say Ai, Ai+1 … Aj is our optimal solution.
//
// Note that no prefix of the solution will ever have a negative sum.
//
// Let us say Ai … Ak prefix had a negative sum.
//
// Sum ( Ai Ai+1 … Aj ) = Sum (Ai … Ak) + Sum(Ak+1 … Aj)
//
// Sum ( Ai Ai+1 … Aj) - Sum(Ak+1 … Aj) = Sum(Ai … Ak)
//
// Now, since Sum(Ai … Ak) < 0,
//
// Sum (Ai Ai+1 … Aj) - Sum (Ak+1 … Aj) < 0
//
// which means Sum(Ak+1 … Aj ) > Sum (Ai Ai+1 … Aj)
//
// This contradicts the fact that Ai, Ai+1 … Aj is our optimal solution.
//
// Instead, Ak+1, Ak+2 … Aj will be our optimal solution.
//
// Similarily, you can prove that for optimal solution, it is always good to include a prefix with positive sum.
public class MaxSumContiguous {
public int maxSubArray(final List<Integer> A) {
int max = Integer.MIN_VALUE;
int sum = 0;
for (Integer aA : A) {
sum += aA;
if (sum > max) {
max = sum;
}
if (sum < 0) {
sum = 0;
}
}
return max;
}
public static void main(String[] args) {
List<Integer> A = new LinkedList<>();
A.add(-2);
A.add(1);
A.add(3);
A.add(4);
A.add(-1);
A.add(2);
A.add(1);
A.add(-5);
A.add(4);
System.out.println(new MaxSumContiguous().maxSubArray(A));
}
}