給一串座標 Points ,回傳 K 個離(0, 0)最近的點。
要知道距離的算法,因為是找跟(0, 0)的距離,所以用 P[0]**2 + P[1]**2,就能作為比較值。(其開根號是距離)
不難,重點要放在如何排序。
使用內建的 sort() 功能就能快速排序,如同官方方法,用 sorted(points, key:lambda x: x[0]**2+x[1]**2),能實現排序,
又不會多使用空間,是最佳解之一。
時間是 O(nlogn),就是排序法(sort)的時間吧。
換個想法,有什麼排序法夠快,最好可以快速找到最小值? min heap。
不然用hashtable以距離作分類,由小開始,加到K個就回傳,這也不用把整個points重新排序。
class Solution: def kClosest(self, points: List[List[int]], K: int) -> List[List[int]]: import heapq heap = [] for p in points: heapq.heappush(heap, [p[0]**2+p[1]**2, p]) return [heapq.heappop(heap)[1] for _ in range(K)]C#
public class Solution { public int[][] KClosest(int[][] points, int K) { var rank = new Dictionary>(); foreach(var p in points) { int dis = p[0]*p[0] + p[1]*p[1]; if(!(rank.ContainsKey(dis))) rank[dis] = new List (); rank[dis].Add(p); } var sortedKeys = new List (rank.Keys); sortedKeys.Sort(); int count = 0; List result = new List (); foreach(int key in sortedKeys) { foreach(var p in rank[key]) { result.Add(p); count += 1; if(count == K) { return result.ToArray(); } } } return result.ToArray(); } }