|
1 |
| - // Bitonic array is an array having strictly increasing order upto an element and then having strictly |
2 |
| - // decreasing order. It is also called Mountain array. |
| 1 | +// Bitonic array is an array having strictly increasing order upto an element and then having strictly |
| 2 | +// decreasing order. It is also called Mountain array. |
3 | 3 |
|
4 |
| - // Program to find element in a bitonic array |
5 |
| - // T.C.: O(log n) |
6 |
| - // S.C.: O(1) |
7 |
| - #include <iostream> |
8 |
| - #include <vector> |
9 |
| - using namespace std; |
| 4 | +// Program to find element in a bitonic array |
| 5 | +// T.C.: O(log n) |
| 6 | +// S.C.: O(1) |
| 7 | +#include <iostream> |
| 8 | +#include <vector> |
| 9 | +using namespace std; |
10 | 10 |
|
11 |
| - int findPeakIndex (vector<int> vect, int size) { // find index of peak element |
12 |
| - int lo = 0, hi = size-1; |
13 |
| - int mid = lo + (hi - lo)/2; |
| 11 | +int findPeakIndex (vector<int> vect, int size) { // find index of peak element |
| 12 | + int lo = 0, hi = size-1; |
| 13 | + int mid = lo + (hi - lo)/2; |
14 | 14 |
|
15 |
| - while (lo < hi) { |
16 |
| - if (mid == size-1 || vect[mid] > vect[mid+1]) { |
17 |
| - hi = mid; |
18 |
| - } |
19 |
| - else if (mid == 0 || vect[mid] > vect[mid-1]) { |
20 |
| - lo = mid+1; |
21 |
| - } |
22 |
| - mid = lo + (hi - lo)/2; |
| 15 | + while (lo < hi) { |
| 16 | + if (mid == size-1 || vect[mid] > vect[mid+1]) { |
| 17 | + hi = mid; |
23 | 18 | }
|
24 |
| - return lo; |
| 19 | + else if (mid == 0 || vect[mid] > vect[mid-1]) { |
| 20 | + lo = mid+1; |
| 21 | + } |
| 22 | + mid = lo + (hi - lo)/2; |
25 | 23 | }
|
| 24 | + return lo; |
| 25 | +} |
26 | 26 |
|
27 |
| - int leftPart (vector<int> vect, int target, int hi) { // search element in left part |
28 |
| - int lo = 0; |
29 |
| - int mid = lo + (hi - lo)/2; |
30 |
| - while (lo <= hi) { |
31 |
| - if (vect[mid] == target) { |
32 |
| - return mid; |
33 |
| - } |
34 |
| - else if (vect[mid] > target) { |
35 |
| - hi = mid - 1; |
36 |
| - } |
37 |
| - else { |
38 |
| - lo = mid + 1; |
39 |
| - } |
40 |
| - mid = lo + (hi - lo)/2; |
| 27 | +int leftPart (vector<int> vect, int target, int hi) { // search element in left part |
| 28 | + int lo = 0; |
| 29 | + int mid = lo + (hi - lo)/2; |
| 30 | + while (lo <= hi) { |
| 31 | + if (vect[mid] == target) { |
| 32 | + return mid; |
| 33 | + } |
| 34 | + else if (vect[mid] > target) { |
| 35 | + hi = mid - 1; |
41 | 36 | }
|
42 |
| - return -1; |
| 37 | + else { |
| 38 | + lo = mid + 1; |
| 39 | + } |
| 40 | + mid = lo + (hi - lo)/2; |
43 | 41 | }
|
| 42 | + return -1; |
| 43 | +} |
44 | 44 |
|
45 |
| - int rightPart (vector<int> vect, int target, int lo) { // search element in right part |
46 |
| - int hi = vect.size()-1; |
47 |
| - int mid = lo + (hi - lo)/2; |
48 |
| - while (lo <= hi) { |
49 |
| - if (vect[mid] == target) { |
50 |
| - return mid; |
51 |
| - } |
52 |
| - else if (vect[mid] < target) { |
53 |
| - hi = mid - 1; |
54 |
| - } |
55 |
| - else { |
56 |
| - lo = mid + 1; |
57 |
| - } |
58 |
| - mid = lo + (hi - lo)/2; |
| 45 | +int rightPart (vector<int> vect, int target, int lo) { // search element in right part |
| 46 | + int hi = vect.size()-1; |
| 47 | + int mid = lo + (hi - lo)/2; |
| 48 | + while (lo <= hi) { |
| 49 | + if (vect[mid] == target) { |
| 50 | + return mid; |
| 51 | + } |
| 52 | + else if (vect[mid] < target) { |
| 53 | + hi = mid - 1; |
59 | 54 | }
|
60 |
| - return -1; |
| 55 | + else { |
| 56 | + lo = mid + 1; |
| 57 | + } |
| 58 | + mid = lo + (hi - lo)/2; |
61 | 59 | }
|
| 60 | + return -1; |
| 61 | +} |
62 | 62 |
|
63 |
| - int findElement(vector<int> vect, int size, int target) { |
64 |
| - // DRIVER CODE |
65 |
| - // find peak of array |
66 |
| - int peak = findPeakIndex (vect, size); |
67 |
| - // compare peak element with target |
68 |
| - if (target > vect[peak]) {return -1;} |
69 |
| - else if (target == vect[peak]) {return peak;} |
70 |
| - // find element in increasing/decreasing sequence |
| 63 | +int findElement(vector<int> vect, int size, int target) { |
| 64 | + // DRIVER CODE |
| 65 | + // find peak of array |
| 66 | + int peak = findPeakIndex (vect, size); |
| 67 | + // compare peak element with target |
| 68 | + if (target > vect[peak]) {return -1;} |
| 69 | + else if (target == vect[peak]) {return peak;} |
| 70 | + // find element in increasing/decreasing sequence |
| 71 | + else { |
| 72 | + int leftIndex = leftPart(vect, target, peak); |
| 73 | + if (leftIndex != -1) { |
| 74 | + return leftIndex; |
| 75 | + } |
71 | 76 | else {
|
72 |
| - int leftIndex = leftPart(vect, target, peak); |
73 |
| - if (leftIndex != -1) { |
74 |
| - return leftIndex; |
75 |
| - } |
76 |
| - else { |
77 |
| - return rightPart(vect, target, peak); |
78 |
| - } |
| 77 | + return rightPart(vect, target, peak); |
79 | 78 | }
|
80 |
| - return 0; |
81 | 79 | }
|
| 80 | + return 0; |
| 81 | +} |
82 | 82 |
|
83 |
| - int main () { |
84 |
| - vector<int> numvect; |
85 |
| - int num, target; |
86 |
| - cin>>num; |
87 |
| - cin>>target; |
88 |
| - for (int i = 0; i < num; i++) { |
89 |
| - int temp; |
90 |
| - cin>>temp; |
91 |
| - numvect.push_back(temp); |
92 |
| - } |
93 |
| - cout<<findElement(numvect, num, target); |
94 |
| - return 0; |
| 83 | +int main () { |
| 84 | + vector<int> numvect; |
| 85 | + int num, target; |
| 86 | + cin>>num; |
| 87 | + cin>>target; |
| 88 | + for (int i = 0; i < num; i++) { |
| 89 | + int temp; |
| 90 | + cin>>temp; |
| 91 | + numvect.push_back(temp); |
95 | 92 | }
|
| 93 | + cout<<findElement(numvect, num, target); |
| 94 | + return 0; |
| 95 | +} |
0 commit comments