-
Notifications
You must be signed in to change notification settings - Fork 119
/
Copy pathFind in Mountain Array.cpp
109 lines (88 loc) · 2.74 KB
/
Find in Mountain Array.cpp
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Runtime: 13 ms (Top 8.65%) | Memory: 6.9 MB (Top 88.34%)
/**
* // This is the MountainArray's API interface.
* // You should not implement it, or speculate about its implementation
* class MountainArray {
* public:
* int get(int index);
* int length();
* };
*/
class Solution {
public:
//----------------------- find peak ---------------------------------------
int find_max(MountainArray &mountainArr,int start,int end)
{ int n= mountainArr.length();
while(start<=end)
{ int mid= start+(end-start)/2;
int next=(mid+1)%n;
int prev=(mid+n-1)%n;
int mid_val = mountainArr.get(mid);
int pre_val = mountainArr.get(prev);
int next_val = mountainArr.get(next);
if(mid_val > next_val and mid_val>pre_val)
return mid;
else if(mid_val<next_val and mid_val > pre_val)
start=mid+1;
else if(mid_val>next_val and mid_val<pre_val)
end=mid-1;
}
return -1;
}
//--------------------------binary search-------------------------------------------
int binary_search(MountainArray &mountainArr,int start,int end,int target)
{
while(start<=end)
{
int mid= start + (end-start)/2;
int mid_val=mountainArr.get(mid);
if(mid_val==target)
return mid;
else if(target < mid_val)
{
end=mid-1;
}
else
start=mid+1;
}
return -1;
}
//----------------------binary search in reverse sorted------------------------------
int binary_search_rev(MountainArray &mountainArr,int start,int end,int target)
{
while(start<=end)
{
int mid= start + (end-start)/2;
int mid_val=mountainArr.get(mid);
if(mid_val==target)
return mid;
else if(target > mid_val)
{
end=mid-1;
}
else
start=mid+1;
}
return -1;
}
//------------------------------returns minimum index of target--------------------------------------
int evaluate_ans(int a,int b)
{
if(a==-1 and b==-1 )
return -1;
else if(a!= -1 and b!= -1)
return min(a,b);
else if(a==-1 and b!=-1)
return b;
else
return a;
}
int findInMountainArray(int target, MountainArray &mountainArr) {
int start=0;
int n= mountainArr.length()-1;
int max_in = find_max(mountainArr,start ,n);
int a= binary_search(mountainArr,start,max_in,target);
int b= binary_search_rev(mountainArr,max_in + 1,n,target);
return evaluate_ans(a,b);
}
};