-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1095.java
84 lines (76 loc) · 1.84 KB
/
1095.java
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import java.util.Arrays;
// This is MountainArray's API interface.
// You should not implement it, or speculate about its implementation
interface MountainArray {
public int get(int index);
public int length();
}
class Solution {
int[] cache;
public int findInMountainArray(int target, MountainArray mountainArr) {
int length = mountainArr.length();
cache = new int[length];
Arrays.fill(cache, -1);
int peak = findPeak(mountainArr);
if (getWithCache(peak, mountainArr) == target)
return peak;
int leftSearch = binarySearchLeft(target, mountainArr, 0, peak);
if (leftSearch != -1) {
return leftSearch;
} else {
return binarySearchRight(target, mountainArr, peak, length - 1);
}
}
int findPeak(MountainArray ma) {
int l = 0;
int r = ma.length() - 1;
int peak = 0;
while (l < r) {
int m = (l + r) / 2;
if (getWithCache(m, ma) < getWithCache(m + 1, ma)) {
l = m + 1;
peak = l;
} else {
r = m;
}
}
return peak;
}
// returns -1 if not found.
int binarySearchLeft(int target, MountainArray ma, int l, int r) {
while (l <= r) {
int m = (l + r) / 2;
if (getWithCache(m, ma) == target) {
return m;
}
if (getWithCache(m, ma) < target) {
l = m + 1;
} else {
r = m - 1;
}
}
return -1;
}
int binarySearchRight(int target, MountainArray ma, int l, int r) {
while (l <= r) {
int m = (l + r) / 2;
if (getWithCache(m, ma) == target) {
return m;
}
if (getWithCache(m, ma) > target) {
l = m + 1;
} else {
r = m - 1;
}
}
return -1;
}
int getWithCache(int i, MountainArray ma) {
if (cache[i] != -1) {
return cache[i];
}
int res = ma.get(i);
cache[i] = res;
return res;
}
}