Given a sorted array arr[] and a value X, find the k closest elements to X in arr[].
Examples:
The crossover point: The point before which elements are smaller than or equal to X and after which elements are greater.
An Optimized Solution is to find k elements in O(Logn + k) time. The idea is to use Binary Search to find the crossover point. Once we find index of crossover point, we can print k closest elements in O(k) time.
Java code: https://gist.github.com/paveytel/432286ad64f58105b10b
Read full article from Find k closest elements to a given value | GeeksforGeeks
Examples:
Input: K = 4, X = 35 arr[] = {12, 16, 22, 30, 35, 39, 42, 45, 48, 50, 53, 55, 56} Output: 30 39 42 45
Note that if the element is present in array, then it should not be in output, only the other closest elements are required.The crossover point: The point before which elements are smaller than or equal to X and after which elements are greater.
An Optimized Solution is to find k elements in O(Logn + k) time. The idea is to use Binary Search to find the crossover point. Once we find index of crossover point, we can print k closest elements in O(k) time.
int findCrossOver(int arr[], int low, int high, int x){ if (arr[high] <= x) // x is greater than all return high; if (arr[low] > x) // x is smaller than all return low; // Find the middle point int mid = (low + high)/2; /* low + (high - low)/2 */ /* If x is same as middle element, then return mid */ if (arr[mid] <= x && arr[mid+1] > x) return mid; /* If x is greater than arr[mid], then either arr[mid + 1] is ceiling of x or ceiling lies in arr[mid+1...high] */ if(arr[mid] < x) return findCrossOver(arr, mid+1, high, x); return findCrossOver(arr, low, mid - 1, x);}// This function prints k closest elements to x in arr[].// n is the number of elements in arr[]void printKclosest(int arr[], int x, int k, int n){ // Find the crossover point int l = findCrossOver(arr, 0, n-1, x); // le int r = l+1; // Right index to search int count = 0; // To keep track of count of elements already printed // If x is present in arr[], then reduce left index // Assumption: all elements in arr[] are distinct if (arr[l] == x) l--; // Compare elements on left and right of crossover // point to find the k closest elements while (l >= 0 && r < n && count < k) { if (x - arr[l] < arr[r] - x) printf("%d ", arr[l--]); else printf("%d ", arr[r++]); count++; } // If there are no more elements on right side, then // print left elements while (count < k && l >= 0) printf("%d ", arr[l--]), count++; // If there are no more elements on left side, then // print right elements while (count < k && r < n) printf("%d ", arr[r++]), count++;}Java code: https://gist.github.com/paveytel/432286ad64f58105b10b
Read full article from Find k closest elements to a given value | GeeksforGeeks