I am given an array of integers. I have to find a peak element in it. An array element is peak if it is NOT smaller than its neighbors. For corner elements,cons
As per other's peoples answers (below mine) some code (with O(log n) ):
// A divide and conquer solution to find a peak element element
#include
// A binary search based function that returns index of a peak element
int findPeakUtil(int arr[], int low, int high, int n)
{
// Fin index of middle element
int mid = low + (high - low)/2; /* (low + high)/2 */
// Compare middle element with its neighbours (if neighbours exist)
if ((mid == 0 || arr[mid-1] <= arr[mid]) &&
(mid == n-1 || arr[mid+1] <= arr[mid]))
return mid;
// If middle element is not peak and its left neighbor is greater than it
// then left half must have a peak element
else if (mid > 0 && arr[mid-1] > arr[mid])
return findPeakUtil(arr, low, (mid -1), n);
// If middle element is not peak and its right neighbor is greater than it
// then right half must have a peak element
else return findPeakUtil(arr, (mid + 1), high, n);
}
// A wrapper over recursive function findPeakUtil()
int findPeak(int arr[], int n)
{
return findPeakUtil(arr, 0, n-1, n);
}
/* Driver program to check above functions */
int main()
{
int arr[] = {1, 3, 20, 4, 1, 0};
int n = sizeof(arr)/sizeof(arr[0]);
printf("Index of a peak point is %d", findPeak(arr, n));
return 0;
}
Used this for MIT 6.006 OCW course may be check that out as well
http://courses.csail.mit.edu/6.006/spring11/rec/rec02.pdf