LeetCode 0973. K Closest Points to Origin Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0973. K Closest Points to Origin

Description

Given an array of points where points[i] = [xi, yi] represents a point on the X-Y plane and an integer k, return the k closest points to the origin (0, 0).

The distance between two points on the X-Y plane is the Euclidean distance (i.e., √(x1 - x2)2 + (y1 - y2)2).

You may return the answer in any order. The answer is guaranteed to be unique (except for the order that it is in).

 

Example 1:

Input: points = [[1,3],[-2,2]], k = 1
Output: [[-2,2]]
Explanation:
The distance between (1, 3) and the origin is sqrt(10).
The distance between (-2, 2) and the origin is sqrt(8).
Since sqrt(8) < sqrt(10), (-2, 2) is closer to the origin.
We only want the closest k = 1 points from the origin, so the answer is just [[-2,2]].

Example 2:

Input: points = [[3,3],[5,-1],[-2,4]], k = 2
Output: [[3,3],[-2,4]]
Explanation: The answer [[-2,4],[3,3]] would also be accepted.

 

Constraints:

  • 1 <= k <= points.length <= 104
  • -104 <= xi, yi <= 104

Solutions

Solution 1: Custom Sorting

We sort all points by their distance from the origin in ascending order, and then take the first k points.

The time complexity is O(n log n), and the space complexity is O(log n). Here, n is the length of the array points.

PythonJavaC++GoTypeScriptRust
class Solution: def kClosest(self, points: List[List[int]], k: int) -> List[List[int]]: points.sort(key=lambda p: hypot(p[0], p[1])) return points[:k](code-box)

Solution 2: Priority Queue (Max Heap)

We can use a priority queue (max heap) to maintain the k closest points to the origin.

The time complexity is O(n × log k), and the space complexity is O(k). Here, n is the length of the array points.

PythonJavaC++GoTypeScript
class Solution: def kClosest(self, points: List[List[int]], k: int) -> List[List[int]]: max_q = [] for i, (x, y) in enumerate(points): dist = math.hypot(x, y) heappush(max_q, (-dist, i)) if len(max_q) > k: heappop(max_q) return [points[i] for _, i in max_q](code-box)

Solution 3: Binary Search

We notice that as the distance increases, the number of points increases as well. There exists a critical value such that the number of points before this value is less than or equal to k, and the number of points after this value is greater than k.

Therefore, we can use binary search to enumerate the distance. In each binary search iteration, we count the number of points whose distance is less than or equal to the current distance. If the count is greater than or equal to k, it indicates that the critical value is on the left side, so we set the right boundary equal to the current distance; otherwise, the critical value is on the right side, so we set the left boundary equal to the current distance plus one.

After the binary search is finished, we just need to return the points whose distance is less than or equal to the left boundary.

The time complexity is O(n × log M), and the space complexity is O(n). Here, n is the length of the array points, and M is the maximum value of the distance.

PythonJavaC++GoTypeScript
class Solution: def kClosest(self, points: List[List[int]], k: int) -> List[List[int]]: dist = [x * x + y * y for x, y in points] l, r = 0, max(dist) while l < r: mid = (l + r) >> 1 cnt = sum(d <= mid for d in dist) if cnt >= k: r = mid else: l = mid + 1 return [points[i] for i, d in enumerate(dist) if d <= l](code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !