class Solution {
public:
vector<vector<int>> kClosest(vector<vector<int>>& points, int k) {
}
};
973. 最接近原点的 K 个点
给定一个数组 points
,其中 points[i] = [xi, yi]
表示 X-Y 平面上的一个点,并且是一个整数 k
,返回离原点 (0,0)
最近的 k
个点。
这里,平面上两点之间的距离是 欧几里德距离( √(x1 - x2)2 + (y1 - y2)2
)。
你可以按 任何顺序 返回答案。除了点坐标的顺序之外,答案 确保 是 唯一 的。
示例 1:
输入:points = [[1,3],[-2,2]], k = 1 输出:[[-2,2]] 解释: (1, 3) 和原点之间的距离为 sqrt(10), (-2, 2) 和原点之间的距离为 sqrt(8), 由于 sqrt(8) < sqrt(10),(-2, 2) 离原点更近。 我们只需要距离原点最近的 K = 1 个点,所以答案就是 [[-2,2]]。
示例 2:
输入:points = [[3,3],[5,-1],[-2,4]], k = 2 输出:[[3,3],[-2,4]] (答案 [[-2,4],[3,3]] 也会被接受。)
提示:
1 <= k <= points.length <= 104
-104 < xi, yi < 104
原站题解
golang 解法, 执行用时: 124 ms, 内存消耗: 7.8 MB, 提交时间: 2020-11-09 14:10:45
type pair struct { dist int point []int } type hp []pair func (h hp) Len() int { return len(h) } func (h hp) Less(i, j int) bool { return h[i].dist > h[j].dist } func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *hp) Push(v interface{}) { *h = append(*h, v.(pair)) } func (h *hp) Pop() interface{} { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v } func kClosest(points [][]int, k int) (ans [][]int) { h := make(hp, k) for i, p := range points[:k] { h[i] = pair{p[0]*p[0] + p[1]*p[1], p} } heap.Init(&h) // O(k) 初始化堆 for _, p := range points[k:] { if dist := p[0]*p[0] + p[1]*p[1]; dist < h[0].dist { h[0] = pair{dist, p} heap.Fix(&h, 0) // 效率比 pop 后 push 要快 } } for _, p := range h { ans = append(ans, p.point) } return }
python3 解法, 执行用时: 752 ms, 内存消耗: 19.1 MB, 提交时间: 2020-11-09 12:01:13
class Solution: def kClosest(self, points: List[List[int]], K: int) -> List[List[int]]: '''用堆排序的方式''' q = [(-x**2 - y**2, i) for i, (x,y) in enumerate(points[:K])] heapq.heapify(q) # 堆化(排序) for j in range(K, len(points)): x, y = points[j] dis = -x**2-y**2 if dis > q[0][0]: heapq.heappushpop(q, (dis, j)) return [points[t] for (_, t) in q]
golang 解法, 执行用时: 140 ms, 内存消耗: 8.1 MB, 提交时间: 2020-11-09 10:49:28
func kClosest(points [][]int, K int) [][]int { sort.Slice(points, func (i,j int)bool{ return points[i][0] * points[i][0] + points[i][1] * points[i][1] < points[j][0] * points[j][0] + points[j][1] * points[j][1] }) return points[:K] }
python3 解法, 执行用时: 636 ms, 内存消耗: 18.8 MB, 提交时间: 2020-11-09 10:39:08
class Solution: def kClosest(self, points: List[List[int]], K: int) -> List[List[int]]: points.sort(key=lambda point: point[0]*point[0]+point[1]*point[1]) return points[:K]