Skip to content

Commit 9c1c583

Browse files
committed
Added MaxSubseqDiffNoOverlap
1 parent 27ec92a commit 9c1c583

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed
File renamed without changes.
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/**
2+
* Find two disjoint (non-overlapping) subsequences in an array with maximum
3+
* difference.
4+
*
5+
* Tags: Array
6+
*/
7+
class MaxSubseqDifferenceNoOverlap {
8+
public static void main(String[] args) {
9+
10+
}
11+
12+
/**
13+
*
14+
*/
15+
public int MaxSubseqDifferenceNoOverlap(int[] A) {
16+
int[] finalMax = null;
17+
int[] finalMin = null;
18+
Integer maxDiff = null; // use Integer to determine whether it's set
19+
for (int i = 0; i < A.length; i++) {
20+
int[] preMax = maxKadane(A, 0, i); // left max
21+
int[] postMin = minKadane(A, i, A.length); // right min
22+
int[] preMin = minKadane(A, 0 ,i); // left min
23+
int[] postMax = maxKadane(A, i, A.length); // right max
24+
25+
int diff1 = sum(A, preMax) - sum(A, postMin);
26+
int diff2 = sum(A, postMax) - sum(A, preMin);
27+
if (diff1 > diff2) {
28+
// if maxDiff not set or diff1 is bigger
29+
if (maxDiff == null || diff1 > maxDiff) { // update maxDiff
30+
maxDiff = diff1;
31+
finalMax = preMax;
32+
finalMin = postMin;
33+
}
34+
} else {
35+
if (maxDiff == null || diff2 > maxDiff) {
36+
maxDiff = diff2;
37+
finalMax = postMax;
38+
finalMin = preMin;
39+
}
40+
}
41+
}
42+
return maxDiff;
43+
}
44+
45+
/**
46+
*
47+
*/
48+
private int[] maxKadane(int[] A, int s, int e) {
49+
int beginTemp = s;
50+
int begin = s;
51+
int end = s;
52+
int maxSoFar = A[s];
53+
int maxEndingHere = A[s];
54+
55+
for (int i = 1; i < e; i++) {
56+
if (maxEndingHere < 0) {
57+
maxEndingHere = A[i];
58+
beginTemp = i;
59+
}
60+
else maxEndingHere += A[i];
61+
62+
if (maxEndingHere >= maxSoFar) {
63+
maxSoFar = maxEndingHere;
64+
begin = beginTemp;
65+
end = i;
66+
}
67+
}
68+
69+
return new int[]{begin, end};
70+
}
71+
72+
/**
73+
* Modification of
74+
*/
75+
private int[] minKadane(int[] A, int s, int e) {
76+
int beginTemp = s;
77+
int begin = s;
78+
int end = s;
79+
int minSoFar = A[s];
80+
int minEndingHere = A[s];
81+
82+
for (int i = 1; i < e; i++) {
83+
if (minEndingHere > 0) {
84+
minEndingHere = A[i];
85+
beginTemp = i;
86+
}
87+
else minEndingHere += A[i];
88+
89+
if (minEndingHere <= minSoFar) {
90+
minSoFar = minEndingHere;
91+
begin = beginTemp;
92+
end = i;
93+
}
94+
}
95+
96+
return new int[]{begin, end};
97+
}
98+
99+
private int sum(int[] A, int[] range) {
100+
int sum = 0;
101+
for (int i = range[0]; i <= range[1]; i++) {
102+
sum += A[i];
103+
}
104+
return sum;
105+
}
106+
}

0 commit comments

Comments
 (0)