The challenge is to efficiently locate K closest elements to 'x' in a sorted array while
maintaining optimal performance.
Here are two efficient approaches:
Approach 1: Two-Pointer Technique -
Use
two pointers
, start
and end, at the array's boundaries.
Calculate absolute differences
from
'x'
for both
pointers.
Move the pointer
with
the larger difference inward until the window contains exactly
K elements
.
Approach 2: Max Heap -
Use a
max heap
to
maintain the K closest elements.
For each element,
calculate its distance
from
'x'
and push it
into the heap.
If the heap size
exceeds K
, remove
the top element of the heap.
Finally, sort the results for the required order.
class Solution { public: vector<int> findClosestElements(vector<int>& arr, int k, int x) { vector<int> ans; int start = 0; int end = arr.size()-1; while(end-start+1 > k){ int diffFromStart = abs(arr[start]-x); int diffFromEnd = abs(arr[end]-x); // If distance of x from starting point is greater than // ending point then move 'start' pointer else move 'end' pointer. if(diffFromStart>diffFromEnd) start++; else end--; } for(int i=start;i<=end;i++) ans.push_back(arr[i]); return ans; } };
class Solution { public: vector<int> findClosestElements(vector<int>& arr, int k, int x) { // Max Heap. Hence, farthest point will be on the top of the Heap. priority_queue<pair<int,int>> pq; vector<int> ans; for(int i=0;i<arr.size();i++){ int distance = abs(x-arr[i]); pq.push({distance,arr[i]}); if(pq.size()>k) pq.pop(); } while(!pq.empty()){ ans.push_back(pq.top().second); pq.pop(); } sort(ans.begin(),ans.end()); return ans; } };
The two-pointer approach runs in O(n) time, while the heap approach takes O(n log k) due to heap operations.
The two-pointer technique uses constant space, while the heap approach requires O(k) space for storage.