K Closest Points to Origin: Day 30 of the May LeetCoding Challenge
“Data dominates. If you’ve chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming.”
~ Rob Pike
Day 30 of the May LeetCoding Challenge by Leetcode
Problem definition: K Closest Points to Origin
We have a list of points
on the plane. Find the K
closest points to the origin (0, 0)
.
(Here, the distance between two points on a plane is the Euclidean distance.)
You may return the answer in any order. The answer is guaranteed to be unique (except for the order that it is in.)
Sample Testcase
Testcase 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]].
Testcase 2
Input: points = [[3,3],[5,-1],[-2,4]], K = 2
Output: [[3,3],[-2,4]]
(The answer [[-2,4],[3,3]] would also be accepted.)
Note:
- 1 <= K <= points.length <= 10000
- -10000 < points[i][0] < 10000
- -10000 < points[i][1] < 10000
I highly encourage you to attempt this problem on your own before looking at my solution.
Approach
Calculate the distance of each point from the origin and save it in a dictionary with the key as the index of the point.
Next sort the dictionary by value. Then, depending on the value of K
fetch the first K index of the sorted dictionary and return the points with those index as your answer.
Solution
class Solution(object):
def kClosest(self, points, K):
"""
:type points: List[List[int]]
:type K: int
:rtype: List[List[int]]
"""
distance = {}
answer = []
if(K==len(points)):
return points
for i in range(len(points)):
distance[i] = math.sqrt( (points[i][0]**2)+(points[i][1]**2) )
sorted_distance = sorted(distance.items(), key=lambda kv: kv[1])
for i in range(K):
answer.append(points[sorted_distance[i][0]])
return answer
Submission Details
Total test cases passed: 83 / 83
Runtime: 604 ms
Memory Usage: 19.9 MB
Note: This submission was better than 78.39% of Python3 solutions in terms of runtime! Try to come up with a better approach! 🌚
I would really recommend you to explore this side of the Computer Science and tune in to the journey of competitive programming to write better, cleaner, efficient and optimal code! 😀
If you have a better approach to this problem, or for any other queries feel free to reach out to me! 😇