1
+ /**
2
+ * // This is MountainArray's API interface.
3
+ * // You should not implement it, or speculate about its implementation
4
+ * interface MountainArray {
5
+ * public int get(int index) {}
6
+ * public int length() {}
7
+ * }
8
+ */
9
+
10
+ class Solution {
11
+ public int findInMountainArray (int target , MountainArray mountainArr ) {
12
+ int maxIndex = findMax (mountainArr );
13
+ int leftResult = binarySearchLeft (mountainArr , target , maxIndex );
14
+ int rightResult = binarySearchRight (mountainArr , target , maxIndex );
15
+
16
+ return (leftResult == -1 && rightResult == -1 ) ? -1 : leftResult == -1 ? rightResult : leftResult ;
17
+ }
18
+
19
+ public int findMax (MountainArray array ) {
20
+ int left = 0 ;
21
+ int right = array .length () - 1 ;
22
+
23
+ while (left <=right ) {
24
+ int mid = left + (right - left )/2 ;
25
+ if (array .get (mid ) < array .get (mid + 1 )) {
26
+ left = mid + 1 ;
27
+ } else {
28
+ right = mid - 1 ;
29
+ }
30
+ }
31
+
32
+ return left ;
33
+ }
34
+
35
+ public int binarySearchLeft (MountainArray array , int target , int right ) {
36
+ int left = 0 ;
37
+
38
+ while (left <=right ) {
39
+ int mid = left + (right - left )/2 ;
40
+ int midValue = array .get (mid );
41
+ if (midValue < target ) {
42
+ left = mid + 1 ;
43
+ } else if (midValue > target ) {
44
+ right = mid - 1 ;
45
+ } else {
46
+ return mid ;
47
+ }
48
+ }
49
+ return -1 ;
50
+ }
51
+
52
+ public int binarySearchRight (MountainArray array , int target , int left ) {
53
+ int right = array .length () - 1 ;
54
+
55
+ while (left <= right ) {
56
+ int mid = left + (right - left )/2 ;
57
+ int midValue = array .get (mid );
58
+
59
+ if (midValue < target ) {
60
+ right = mid - 1 ;
61
+ } else if (midValue > target ) {
62
+ left = mid + 1 ;
63
+ } else {
64
+ return mid ;
65
+ }
66
+ }
67
+ return -1 ;
68
+ }
69
+ }
0 commit comments