1
+ // Runtime: 13 ms (Top 8.65%) | Memory: 6.9 MB (Top 88.34%)
1
2
/* *
2
3
* // This is the MountainArray's API interface.
3
4
* // You should not implement it, or speculate about its implementation
4
5
* class MountainArray {
5
- * public:
6
- * int get(int index);
7
- * int length();
6
+ * public:
7
+ * int get(int index);
8
+ * int length();
8
9
* };
9
10
*/
10
11
11
12
class Solution {
12
13
public:
13
-
14
+
14
15
// ----------------------- find peak ---------------------------------------
15
-
16
+
16
17
int find_max (MountainArray &mountainArr,int start,int end)
17
18
{ int n= mountainArr.length ();
18
19
while (start<=end)
19
- { int mid= start+(end-start)/2 ;
20
+ { int mid= start+(end-start)/2 ;
20
21
int next=(mid+1 )%n;
21
22
int prev=(mid+n-1 )%n;
22
-
23
+
23
24
int mid_val = mountainArr.get (mid);
24
25
int pre_val = mountainArr.get (prev);
25
26
int next_val = mountainArr.get (next);
26
-
27
+
27
28
if (mid_val > next_val and mid_val>pre_val)
28
29
return mid;
29
-
30
- else if (mid_val<next_val and mid_val > pre_val)
30
+
31
+ else if (mid_val<next_val and mid_val > pre_val)
31
32
start=mid+1 ;
32
-
33
+
33
34
else if (mid_val>next_val and mid_val<pre_val)
34
35
end=mid-1 ;
35
-
36
+
36
37
}
37
38
return -1 ;
38
-
39
+
39
40
}
40
-
41
-
42
-
43
-
44
- // --------------------------binary search-------------------------------------------
45
-
41
+
42
+ // --------------------------binary search-------------------------------------------
43
+
46
44
int binary_search (MountainArray &mountainArr,int start,int end,int target)
47
45
{
48
46
while (start<=end)
49
47
{
50
48
int mid= start + (end-start)/2 ;
51
49
int mid_val=mountainArr.get (mid);
52
-
50
+
53
51
if (mid_val==target)
54
52
return mid;
55
53
else if (target < mid_val)
@@ -61,12 +59,9 @@ class Solution {
61
59
}
62
60
return -1 ;
63
61
}
64
-
65
-
66
-
67
-
68
- // ----------------------binary search in reverse sorted------------------------------
69
-
62
+
63
+ // ----------------------binary search in reverse sorted------------------------------
64
+
70
65
int binary_search_rev (MountainArray &mountainArr,int start,int end,int target)
71
66
{
72
67
while (start<=end)
@@ -84,12 +79,9 @@ class Solution {
84
79
}
85
80
return -1 ;
86
81
}
87
-
88
-
89
-
90
-
82
+
91
83
// ------------------------------returns minimum index of target--------------------------------------
92
-
84
+
93
85
int evaluate_ans (int a,int b)
94
86
{
95
87
if (a==-1 and b==-1 )
@@ -98,22 +90,20 @@ class Solution {
98
90
return min (a,b);
99
91
else if (a==-1 and b!=-1 )
100
92
return b;
101
- else
93
+ else
102
94
return a;
103
-
95
+
104
96
}
105
-
97
+
106
98
int findInMountainArray (int target, MountainArray &mountainArr) {
107
-
108
-
109
-
99
+
110
100
int start=0 ;
111
101
int n= mountainArr.length ()-1 ;
112
- int max_in = find_max (mountainArr,start ,n);
113
-
102
+ int max_in = find_max (mountainArr,start ,n);
103
+
114
104
int a= binary_search (mountainArr,start,max_in,target);
115
105
int b= binary_search_rev (mountainArr,max_in + 1 ,n,target);
116
-
106
+
117
107
return evaluate_ans (a,b);
118
108
}
119
- };
109
+ };
0 commit comments