This can be done in O(logN) time and O(1) space by using a slightly modified binary search.
Consider a new array Y such that Y[i] = X[i] - i
Array X : -3 -1 0 3 5 7 index : 0 1 2 3 4 5 Array Y : -3 -2 -2 0 1 2 Since the elements in X are in increasing order, the elements in the new array Y will be in non-decreasing order. So a binary search for 0 in Y will give the answer.
But creating Y will take O(N) space and O(N) time. So instead of creating the new array you just modify the binary search such that a reference to Y[i] is replaced by X[i] - i.
Code : int FindIndex_Value(int a[],int low,int high){ int mid = (low+high)/2;
Implement a function getbits, that returns the(right adjusted) n bits that begin at position p of an integer. Assume bit position 0 is at the right end and that n and p are sensible positive values.
You are given n real numbers in an array. A number in the array is called a decimal dominant if it occurs more than n/10 times in the array. Give an O(n) time algorithm to determine if the given array has a decimal dominant.
This can be done in O(logN) time and O(1) space by using a slightly modified binary search.
ReplyDeleteConsider a new array Y such that Y[i] = X[i] - i
Array X : -3 -1 0 3 5 7
index : 0 1 2 3 4 5
Array Y : -3 -2 -2 0 1 2
Since the elements in X are in increasing order, the elements in the new array Y will be in non-decreasing order. So a binary search for 0 in Y will give the answer.
But creating Y will take O(N) space and O(N) time. So instead of creating the new array you just modify the binary search such that a reference to Y[i] is replaced by X[i] - i.
Code :
int FindIndex_Value(int a[],int low,int high){
int mid = (low+high)/2;
if( a[mid] == mid )
return mid;
if(a[mid]< mid)
return FindIndex_Value(a,low,mid-1);
else
return FindIndex_Value(a,mid+1,high);
}