Find the K closest points to origin using Priority Queue - GeeksforGeeks

24 Nov, 2021
Given a list of n points on 2D plane, the task is to find the K (k < n) closest points to the origin O(0, 0). Note: The distance between a point P(x, y) and O(0, 0) using the standard Euclidean Distance. Examples:
Input: [(1, 0), (2, 1), (3, 6), (-5, 2), (1, -4)], K = 3 Output: [(1, 0), (2, 1), (1, -4)] Explanation: Square of Distances of points from origin are (1, 0) : 1 (2, 1) : 5 (3, 6) : 45 (-5, 2) : 29 (1, -4) : 17 Hence for K = 3, the closest 3 points are (1, 0), (2, 1) & (1, -4).Input: [(1, 3), (-2, 2)], K = 1 Output: [(-2, 2)] Explanation: Square of Distances of points from origin are (1, 3) : 10 (-2, 2) : 8 Hence for K = 1, the closest point is (-2, 2).
Approach using sorting based on distance: This approach is explained in this article.Approach using Priority Queue for comparison: To solve the problem mentioned above, the main idea is to store the coordinates of the point in a priority queue of pairs, according to the distance of the point from the origin. For assigning the maximum priority to the least distant point from the origin, we use the Comparator class in Priority Queue. Then print the first K elements of the priority queue.Below is the implementation of above approach:
C++
Java
Javascript
Python3
// C++ implementation to find the K// closest points to origin// using Priority Queue #include <bits/stdc++.h>using namespace std; // Comparator class to assign// priority to coordinatesclass comp { public:    bool operator()(pair<int, int> a,                    pair<int, int> b)    {        int x1 = a.first * a.first;        int y1 = a.second * a.second;        int x2 = b.first * b.first;        int y2 = b.second * b.second;         // return true if distance        // of point 1 from origin        // is greater than distance of        // point 2 from origin        return (x1 + y1) > (x2 + y2);    }}; // Function to find the K closest pointsvoid kClosestPoints(int x[], int y[],                    int n, int k){    // Create a priority queue    priority_queue<pair<int, int>,                   vector<pair<int, int> >,                   comp>        pq;     // Pushing all the points    // in the queue    for (int i = 0; i < n; i++) {        pq.push(make_pair(x[i], y[i]));    }     // Print the first K elements    // of the queue    for (int i = 0; i < k; i++) {         // Store the top of the queue        // in a temporary pair        pair<int, int> p = pq.top();         // Print the first (x)        // and second (y) of pair        cout << p.first << " "             << p.second << endl;         // Remove top element        // of priority queue        pq.pop();    }} // Driver codeint main(){    // x coordinate of points    int x[] = { 1, -2 };     // y coordinate of points    int y[] = { 3, 2 };    int K = 1;     int n = sizeof(x) / sizeof(x[0]);     kClosestPoints(x, y, n, K);     return 0;}
// Java implementation to find the K// closest points to origin// using Priority Queueimport java.util.*; // Point class to store// a pointclass Pair implements Comparable<Pair>{    int first, second;    Pair(int a, int b)    {        first = a;        second = b;    }         public int compareTo(Pair o)    {        int x1 = first * first;        int y1 = second * second;        int x2 = o.first * o.first;        int y2 = o.second * o.second;        return (x1 + y1) - (x2 + y2);    }} class GFG{     // Function to find the K closest pointsstatic void kClosestPoints(int x[], int y[],                           int n, int k){    // Create a priority queue    PriorityQueue<Pair> pq = new PriorityQueue<>();     // Pushing all the points    // in the queue    for(int i = 0; i < n; i++)    {        pq.add(new Pair(x[i], y[i]));    }     // Print the first K elements    // of the queue    for(int i = 0; i < k; i++)    {         // Remove the top of the queue        // and store in a temporary pair        Pair p = pq.poll();         // Print the first (x)        // and second (y) of pair        System.out.println(p.first +                     " " + p.second);    }} // Driver codepublic static void main(String[] args){         // x coordinate of points    int x[] = { 1, -2 };     // y coordinate of points    int y[] = { 3, 2 };    int K = 1;     int n = x.length;     kClosestPoints(x, y, n, K);}} // This code is contributed by jrishabh99
<script> // Javascript implementation to find the K// closest points to origin// using Priority Queue // Function to find the K closest pointsfunction kClosestPoints(x, y, n, k){    // Create a priority queue    var pq = [];     // Pushing all the points    // in the queue    for (var i = 0; i < n; i++) {        pq.push([x[i], y[i]]);    }     // Print the first K elements    // of the queue    for (var i = 0; i < k; i++) {         // Store the top of the queue        // in a temporary pair        var p = pq[pq.length-1];         // Print the first (x)        // and second (y) of pair        document.write( p[0] + " "              + p[1] + "<br>");         // Remove top element        // of priority queue        pq.pop();    }} // Driver code// x coordinate of pointsvar x = [1, -2]; // y coordinate of pointsvar y = [3, 2];var K = 1;var n = x.length;kClosestPoints(x, y, n, K); // This code is contributed by rutvik_56.</script>
# Python3 implementation to find the K# closest points to origin# using Priority Queue import heapq as hq# Function to find the K closest pointsdef kClosestPoints(x, y, n, k):    # Create a priority queue    pq=[]     # Pushing all the points    # in the queue    for i in range(n):        hq.heappush(pq, (x[i]*x[i]+y[i]*y[i],x[i],y[i]))         # Print the first K elements    # of the queue    for i in range(k) :         # Store the top of the queue        # in a temporary pair        p = hq.heappop(pq)         # Print the first (x)        # and second (y) of pair        print("{} {}".format(p[1],p[2]))    # Driver codeif __name__ == '__main__':    # x coordinate of points    x = [1, -2]     # y coordinate of points    y = [3, 2]    K = 1     n=len(x)     kClosestPoints(x, y, n, K)
-2 2
 
Time Complexity: O(N + K * log(N))Auxiliary Space: O(N) 
jrishabh99
pankajsharmagfg
rutvik_56
amartyaghoshgfg
Amazon
priority-queue
STL
Data Structures
Geometric
Mathematical
Queue
Sorting
Amazon
Data Structures
Mathematical
Sorting
Queue
Geometric
STL
priority-queue
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
SDE SHEET - A Complete Guide for SDE Preparation
DSA Sheet by Love Babbar
Introduction to Algorithms
Introduction to Tree Data Structure
Insertion and Deletion in Heaps
Program for distance between two points on earth
How to check if a given point lies inside or outside a polygon?
How to check if two given line segments intersect?
Find if two rectangles overlap
Convex Hull | Set 1 (Jarvis's Algorithm or Wrapping)