0% found this document useful (0 votes)
68 views14 pages

Binary Search Techniques

Uploaded by

Rohit Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
68 views14 pages

Binary Search Techniques

Uploaded by

Rohit Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

BINARY SEARCH

BINARY SEARCH BINARY SEARCH


int search(vector<int>& nums, int target) int search(vector<int>& nums, int target)
{ {
int n= [Link](); return search(nums,0,[Link]()-1,target);
int low =0; }
int high = n-1; int search(vector<int>& nums, int low, int high,
while(low<=high) int target)
{ {
int mid = (low+high)/2;
if(target==nums[mid]) return mid; if(low>high) return -1;
else if(target>nums[mid]) low=mid+1; int mid = (low+high)/2;
else high = mid-1; if(nums[mid]==target) return mid;
} else if(nums[mid]>target) return
return -1; search(nums,low,mid-1,target);
} else return search(nums,mid+1,high,target);
}

time complexity is O(logN) time complexity is O(logN)

UPPER BOUND LOWER BOUND


int upperBound(vector<int> &arr, int x, int n) int lowerBound(vector<int> arr, int n, int x)
{ { int low=0;
int low =0; int high = n-1;
int high = n-1; int ans =N;
int ans=n; while(low<=high)
while(low<=high) {
{ mid=(low+high)/2;
int mid = (low+high)/2; if(x<=arr[mid])
if(arr[mid]>x) {
{ ans=mid;
ans = mid; high = mid-1;
high = mid-1; }
} else low=mid+1;
else low=mid+1; }
} return ans;
return ans; }
}
Search Insert Position

int searchInsert(vector<int>& arr, int m)


{
int low =0;
int n = [Link]();
int high = n-1;
int ans=n;
while(low<=high)
{
int mid = (low+high)/2;
if(arr[mid]>=m)
{

ans=mid;
high =mid-1;
}
else
{
low = mid+1;
}
}
return ans;
}

FLOOR AND CEIL


int floor(vector<int> &a, int n, int x)
{
int low =0;
int high =n-1;
int ans =-1;
while(low<=high)
{
int mid= (low+high)/2;
if(a[mid]<=x)
{
ans = a[mid];
low = mid+1;
}
else high = mid-1;
}
return ans;
}
int ceil(vector<int> &a, int n, int x)
{
int low =0;
int high = n-1;
int ans =-1;
while(low <= high)
{
int mid = (low+high)/2;
if(a[mid]>=x)
{
ans = a[mid];
high=mid-1;
}
else
{
low = mid+1;
}
}
return ans;
}
pair<int, int> getFloorAndCeil(vector<int> &a, int n, int x)
{
int f= floor(a,n,x);
int c = ceil(a,n,x);
return {f,c};
}

First and Last Position of an Element In Sorted Array

vector<int> searchRange(vector<int>& nums, int target) int first(vector<int>& arr, int n, int k)
{ {
int left=0; int low =0;
int right = [Link]()-1; int high = n-1;
vector<int>ans={-1,-1}; int res=-1;
while(left<= right) while(low<=high)
{ {
if(nums[left]==target && ans[0]==-1)
int mid = (low+high)/2;
{
if(arr[mid]==k)
ans[0]=left;
{
}
res=mid;
if(nums[right]==target && ans[1]==-1)
high = mid-1;
{
}
ans[1]=right;
} else if(arr[mid]>k)
if(nums[left]<target) left++; {
else right--; high = mid-1;
} }
return ans; else low= mid+1;
} }
return res;
}
int last(vector<int>& arr, int n, int k)
time complexity of your code is O(N)
{
space complexity remains O(1)
int low =0;
int high = n-1;
int res =-1;
while (low<=high)
{
int mid = (low+high)/2;
if(arr[mid]==k)
{
res=mid;
low=mid+1;
}
else if(arr[mid]>k)
{
high=mid-1;
}
else low=mid+1;
}
return res;
}
pair<int, int>
firstAndLastPosition(vector<int>& arr,
int n, int k)
{
int f=first(arr,n,k);
int l=last(arr,n,k);
return {f,l};
}
O(log N)
O(1)

Search In Rotated Sorted Array

int search(vector<int>& nums, int target) int search(vector<int>& arr, int n, int k)
{ {
for (int i = 0; i < [Link](); i++) int low=0,high=n-1;
{ while(low<=high)
if (nums[i] == target) {
{ int mid= (low+high)/2;
return i;
if(arr[mid]==k)
}
return mid;
}
if (arr[low]<=arr[mid])
return -1;
{
}
if ((arr[low]<=k) &&
(k<=arr[mid]))
{
high=mid-1;
}
else
{
low =mid +1;
}
}
else
{
if((arr[mid]<=k) &&
(k<=arr[high]))
{
low=mid+1;
}
else
{
high =mid -1;
}
}

}
return -1;
}
99
10 11 1 2 3 4 5 6 9
8 11
3 5 7 8 9 10 11 2

Search in Rotated Sorted Array II


bool bool search(vector<int>& nums, int target)
searchInARotatedSortedArrayII(vecto {
r<int>&A,int key) int n = [Link]();
{ int low =0;
int n = [Link](); int high =n-1;
for(int i=0;i<n;i++) while(low<=high)
{
{
int mid =(low+high)/2;
if (A[i]==key) return true;
if(nums[mid]==target) return true;
}
if(nums[low]==nums[mid] && nums[mid]==nums[high])
return false;
{
}
low++;high--;
continue;
}
if(nums[low]<=nums[mid])
{
if(nums[low]<=target && nums[mid]>=target)
{
high = mid-1;
}
else low=mid+1;
}
else
{
if(nums[mid]<=target && nums[high]>=target)
{
low = mid+1;
}
else high = mid-1;
}
}
return false;
}

Find Minimum in Rotated Sorted Array

int findMin(vector<int>& nums) int findMin(vector<int>& nums)


{ {
int n =[Link](); int low=0;
int minm=INT_MAX; int n = [Link]();
int high = n-1;
for(int i=0;i<n;i++) int ans = INT_MAX;
{ while(low<=high)
if(nums[i]<minm)
{
{
int mid= (low+high)/2;
minm=min(minm, nums[i]);
if(nums[low]<=nums[high])
} {
} ans = min(ans,nums[low]);
return minm; }
} if(nums[low]<=nums[mid])
{
ans = min(ans,nums[low]);
low=mid+1;
}
else
{
ans = min(ans,nums[mid]);
high = mid-1;
}
}
return ans;
}

Find out how many times has an array is rotated


int findKRotation(vector<int> &arr) int findKRotation(vector<int> &arr)
{ {
int n = [Link](); int low =0;
int ans =arr[0]; int n = [Link]();
int res=0; int high = n-1;
for(int i =1; i<n; i++) int ans =INT_MAX;
{ int index=-1;
if(ans>arr[i]) while(low<=high)
{ {
ans=arr[i]; int mid =(low+high)/2;
res=i; if(arr[low]<=arr[high])
} {
} if(arr[low]<ans)
return res; {
} ans=arr[low];
index = low;
}
break;
}
if(arr[low]<=arr[mid])
{
if(ans>arr[low])
{
ans = arr[low];
index=low;
}
low= mid+1;
}
else
{
if(ans>arr[mid])
{
ans = arr[mid];
index=mid;
}
high = mid-1;
}
}
return index;
}

int #include <bits/stdc++.h>


singleNonDuplicate(vector using namespace std;
<int>& arr) int singleNonDuplicate(vector<int>& arr)
{ {
int n = [Link](); int n = [Link]();
int cnt=0; if (n == 1) return arr[0];
int i=0; if (arr[0] != arr[1]) return arr[0];
while(i<n) if (arr[n - 1] != arr[n - 2]) return arr[n - 1];
{ int low = 1, high = n - 2;
while (low <= high)
if(arr[i]!=arr[i+1]) {
{ int mid = (low + high) / 2;
return arr[i]; if (arr[mid] != arr[mid + 1] && arr[mid] != arr[mid - 1])
} {
i=i+2; return arr[mid];
} }
} if ((mid % 2 == 1 && arr[mid] == arr[mid - 1])
|| (mid % 2 == 0 && arr[mid] == arr[mid + 1]))
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
return -1;
}
int findPeakElement(vector<int> &arr) int findPeakElement(vector<int> &arr)
{ {
int n = [Link](); int n = [Link]();
if(n==1) return 0; if (n == 1)
if (arr[0] > arr[1]) {
{ return 0;
return 0; }
} if (arr[0] > arr[1])
if (arr[n - 1] > arr[n - 2]) {
{ return 0;
return n - 1; }
} if (arr[n - 1] > arr[n - 2])
for(int i = 1;i<=n-2;i++) {
{ return n - 1;
}
if((arr[i]>arr[i-1])&&(arr[i]>arr[i+1])) int low = 1;
{ int high = n - 2;
return i; while (low <= high) {
} int mid = low + (high - low) / 2;
} if (arr[mid] > arr[mid - 1] && arr[mid] >
return -1; arr[mid + 1])
} {
return mid;
Time Complexity: O(N), N = size of the }
given array. else if (arr[mid] > arr[mid - 1])
Reason: We are traversing the entire {
array. low = mid + 1;
}
Space Complexity: O(1) as we are not else
using any extra space. {
high = mid - 1;
}
}
return -1;
}
Square root of s a number
int floorSqrt(int n) int floorSqrt(int n)
{ {
if (n == 0 || n == 1) int low =1;
{ int high = n;
return n; while(low<=high)
} {
int ans = 1; int mid = (low+high )/2;
for (int i = 1; i <= n; ++i) int val = mid*mid;
{ if(val<=n)
int val = i * i; {
if (val > n) low = mid+1;
{ }
break; else
} {
ans = i; high = mid-1;
} }
return ans; }
} return high;
}

Nth root
int power(int base, int exp) int func(int mid, int n, int m)
{ {
int result = 1; long long ans = 1;
while (exp > 0) for (int i = 1; i <= n; ++i)
{ {
if (exp % 2 == 1) ans *= mid;
{ if (ans > m)
result = result * base; {
} return 2;
base =base* base; }
exp =exp/2; }
} if (ans == m)
return result; {
} return 1;
int NthRoot(int n, int m) }
{ return 0;
for (int i = 1; i <= m; i++) }
{
int v = power(i, n); int NthRoot(int n, int m)
if (v == m) {
{ if (n == 1)
return i; {
} return m;
else if (v > m) }
{
break; int low = 1;
} int high = m;
} while (low <= high)
return -1; {
} int mid = low + (high -
low) / 2;
int midN = func(mid, n, m);
if (midN == 1)
{
return mid;
}
else if (midN == 2)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return -1;
}

Median of two sorted array


double median(vector<int>& a, vector<int>& b)
{
int n = [Link]();
int m = [Link]();
int left = 0;
int low = a[left];
int right = 0;
int high = b[right];
vector<int> ans;
while (left < n && right < m)
{
if (a[left] <= b[right])
{
ans.push_back(a[left]);
left++;
}
else
{
ans.push_back(b[right]);
right++;
}
}
while (left < n)
{
ans.push_back(a[left]);
left++;
}
while (right < m)
{
ans.push_back(b[right]);
right++;
}
int vs = [Link]();
if (vs % 2 == 0)
{
int j = vs / 2;
return double((ans[j] + ans[j - 1]) / 2.0);
}
else
{
int j = vs / 2;
return double(ans[j]);
}
}

You might also like