Skip to content

Commit

Permalink
add khushal87 binary-search-code
Browse files Browse the repository at this point in the history
  • Loading branch information
khushal87 committed Jan 31, 2021
1 parent 926fd79 commit 8549663
Show file tree
Hide file tree
Showing 9 changed files with 411 additions and 40 deletions.
11 changes: 10 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@
"vector": "cpp",
"ostream": "cpp",
"deque": "cpp",
"string": "cpp"
"string": "cpp",
"array": "cpp",
"forward_list": "cpp",
"list": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"string_view": "cpp",
"initializer_list": "cpp",
"regex": "cpp",
"valarray": "cpp"
}
}
43 changes: 43 additions & 0 deletions Binary Search/allocate_min_number_of_pages.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#include <bits/stdc++.h>
using namespace std;

bool isValid(int arr[], int n, int k, int mx)
{
int stud = 1;
int sum = 0;
for (int i = 0; i < n; i++)
{
sum += arr[i];
if (sum > mx)
{
stud++;
sum = arr[i];
}
if (stud > k)
return false;
}
return true;
}

int allocateMinNumberOfPage(int arr[], int n, int k)
{
if (n < k)
return -1;
int start = *max_element(arr, arr + n);
int end = accumulate(arr, arr + n, 0);
int result = -1;
while (start <= end)
{
int mid = start + (end - start) / 2;
if (isValid(arr, n, k, mid))
{
result = mid;
end = mid - 1;
}
else
{
start = mid + 1;
}
}
return result;
}
15 changes: 8 additions & 7 deletions Binary Search/find_a_element_in_rotated_sorted_array.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include <bits/stdc++.h>
using namespace std;

int binarySearch(int arr[], int n, int start, int end, int el)
int ascBinarySearch(vector<int> &arr, int n, int start, int end, int el)
{
if (start <= end)
{
Expand All @@ -12,17 +12,17 @@ int binarySearch(int arr[], int n, int start, int end, int el)
}
else if (arr[mid] < el)
{
return binarySearch(arr, n, mid + 1, end, el);
return ascBinarySearch(arr, n, mid + 1, end, el);
}
else
{
return binarySearch(arr, n, start, mid - 1, el);
return ascBinarySearch(arr, n, start, mid - 1, el);
}
}
return -1;
}

int pivotIdx(int arr[], int n)
int pivotIdx(vector<int> &arr, int n)
{
if (arr[0] < arr[n - 1])
return 0;
Expand Down Expand Up @@ -58,11 +58,12 @@ int pivotIdx(int arr[], int n)
}
}

int solve(int arr[], int n, int el)
int solve(vector<int> &arr, int n, int el)
{
int n = arr.size();
int pdx = pivotIdx(arr, n);
int idx1 = binarySearch(arr, n, 0, pdx - 1, el);
int idx2 = binarySearch(arr, n, pdx, n - 1, el);
int idx1 = ascBinarySearch(arr, n, 0, pdx - 1, el);
int idx2 = ascBinarySearch(arr, n, pdx, n - 1, el);
if (idx1 == -1 && idx2 == -1)
return -1;
else
Expand Down
50 changes: 50 additions & 0 deletions Binary Search/maximum_in_bitonic_array.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#include <bits/stdc++.h>
using namespace std;

//same as finding peak element
int peakElement(int arr[], int n)
{
int start = 0;
int end = n - 1;
while (start <= end)
{
int mid = start + (end - start) / 2;
if (mid > 0 && mid < n - 1)
{
if (arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1])
{
return mid;
}
else if (arr[mid - 1] > arr[mid])
{
end = mid - 1;
}
else
{
start = mid + 1;
}
}
else if (mid == 0)
{
if (arr[mid + 1] < arr[mid])
{
return mid;
}
else
{
return mid + 1;
}
}
else if (mid == n - 1)
{
if (arr[mid] > arr[mid - 1])
{
return mid;
}
else
{
return mid - 1;
}
}
}
}
49 changes: 49 additions & 0 deletions Binary Search/peak_element.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#include <bits/stdc++.h>
using namespace std;

int peakElement(int arr[], int n)
{
int start = 0;
int end = n - 1;
while (start <= end)
{
int mid = start + (end - start) / 2;
if (mid > 0 && mid < n - 1)
{
if (arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1])
{
return mid;
}
else if (arr[mid - 1] > arr[mid])
{
end = mid - 1;
}
else
{
start = mid + 1;
}
}
else if (mid == 0)
{
if (arr[mid + 1] < arr[mid])
{
return mid;
}
else
{
return mid + 1;
}
}
else if (mid == n - 1)
{
if (arr[mid] > arr[mid - 1])
{
return mid;
}
else
{
return mid - 1;
}
}
}
}
113 changes: 113 additions & 0 deletions Binary Search/search_in_bitonic_array.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#include <bits/stdc++.h>
using namespace std;

int ascBinarySearch(vector<int> &arr, int n, int start, int end, int el)
{
if (start <= end)
{
int mid = start + (end - start) / 2;
if (arr[mid] == el)
{
return mid;
}
else if (arr[mid] < el)
{
return ascBinarySearch(arr, n, mid + 1, end, el);
}
else
{
return ascBinarySearch(arr, n, start, mid - 1, el);
}
}
return -1;
}

int descBinarySearch(vector<int> &arr, int n, int start, int end, int el)
{
if (start <= end)
{
int mid = start + (end - start) / 2;
if (arr[mid] == el)
{
return mid;
}
else if (arr[mid] > el)
{
return descBinarySearch(arr, n, mid + 1, end, el);
}
else
{
return descBinarySearch(arr, n, start, mid - 1, el);
}
}
return -1;
}

//same as finding peak element
int peakElement(vector<int> &arr, int n)
{
int start = 0;
int end = n - 1;
while (start <= end)
{
int mid = start + (end - start) / 2;
if (mid > 0 && mid < n - 1)
{
if (arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1])
{
return mid;
}
else if (arr[mid - 1] > arr[mid])
{
end = mid - 1;
}
else
{
start = mid + 1;
}
}
else if (mid == 0)
{
if (arr[mid + 1] < arr[mid])
{
return mid;
}
else
{
return mid + 1;
}
}
else if (mid == n - 1)
{
if (arr[mid] > arr[mid - 1])
{
return mid;
}
else
{
return mid - 1;
}
}
}
}

int solve(vector<int> &arr, int el)
{
int n = arr.size();
int pdx = peakElement(arr, n);
int idx1 = ascBinarySearch(arr, n, 0, pdx - 1, el);
int idx2 = descBinarySearch(arr, n, pdx, n - 1, el);
if (idx1 == -1 && idx2 == -1)
return -1;
else
{
if (idx1 == -1)
{
return idx2;
}
if (idx2 == -1)
{
return idx1;
}
}
}
24 changes: 24 additions & 0 deletions Binary Search/search_in_row_column_sorted_array.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include <bits/stdc++.h>
using namespace std;

pair<int, int> index(vector<vector<int>> &arr, int n, int m, int el)
{
int i = 0;
int j = m - 1;
while ((i >= 0 && i < n) && (j >= 0 && j < m))
{
if (arr[i][j] == el)
{
return {i, j};
}
else if (arr[i][j] > el)
{
j--;
}
else
{
i++;
}
}
return {-1, -1};
}
Loading

0 comments on commit 8549663

Please sign in to comment.