leetcode.975 Odd Even Jump

dynamic Programming

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
public int oddEvenJumps(int[] A) {
int N = A.length;
if (N <= 1) return N;
boolean[] odd = new boolean[N];
boolean[] even = new boolean[N];
odd[N-1] = even[N-1] = true;

TreeMap<Integer, Integer> vals = new TreeMap();
vals.put(A[N-1], N-1);
for (int i = N-2; i >= 0; --i) {
int v = A[i];
if (vals.containsKey(v)) {
odd[i] = even[vals.get(v)];
even[i] = odd[vals.get(v)];
} else {
Integer lower = vals.lowerKey(v);
Integer higher = vals.higherKey(v);

if (lower != null)
even[i] = odd[vals.get(lower)];
if (higher != null) {
odd[i] = even[vals.get(higher)];
}
}
vals.put(v, i);
}

int ans = 0;
for (boolean b: odd)
if (b) ans++;
return ans;
}