2
* // This is the MountainArray's API interface.3
* // You should not implement it, or speculate about its implementation4
* class MountainArray {13
//----------------------- find peak ---------------------------------------15
int find_max(MountainArray &mountainArr, int start, int end) {16
int n = mountainArr.length();17
while (start <= end) {18
int mid = start + (end - start) / 2;19
int next = (mid + 1) % n;20
int prev = (mid + n - 1) % n;22
int mid_val = mountainArr.get(mid);23
int pre_val = mountainArr.get(prev);24
int next_val = mountainArr.get(next);26
if (mid_val > next_val and mid_val > pre_val)29
else if (mid_val < next_val and mid_val > pre_val)32
else if (mid_val > next_val and mid_val < pre_val)38
//--------------------------binary39
// search-------------------------------------------41
int binary_search(MountainArray &mountainArr, int start, int end, int target) {42
while (start <= end) {43
int mid = start + (end - start) / 2;44
int mid_val = mountainArr.get(mid);46
if (mid_val == target)48
else if (target < mid_val) {56
//----------------------binary search in reverse57
// sorted------------------------------59
int binary_search_rev(MountainArray &mountainArr, int start, int end, int target) {60
while (start <= end) {61
int mid = start + (end - start) / 2;62
int mid_val = mountainArr.get(mid);63
if (mid_val == target)65
else if (target > mid_val) {73
//------------------------------returns minimum index of74
// target--------------------------------------76
int evaluate_ans(int a, int b) {77
if (a == -1 and b == -1)79
else if (a != -1 and b != -1)81
else if (a == -1 and b != -1)87
int findInMountainArray(int target, MountainArray &mountainArr) {89
int n = mountainArr.length() - 1;90
int max_in = find_max(mountainArr, start, n);92
int a = binary_search(mountainArr, start, max_in, target);93
int b = binary_search_rev(mountainArr, max_in + 1, n, target);95
return evaluate_ans(a, b);