0973. 最接近原点的 K 个点【中等】
1. 📝 题目描述
给定一个数组 points,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点,并且是一个整数 k,返回离原点 (0,0) 最近的 k 个点。
这里,平面上两点之间的距离是欧几里德距离(√(x1 - x2)^2 + (y1 - y2)^2)。
你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。
示例 1:

txt
输入: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]]。1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
示例 2:
txt
输入:points = [[3,3],[5,-1],[-2,4]], k = 2
输出:[[3,3],[-2,4]]
(答案 [[-2,4],[3,3]] 也会被接受。)1
2
3
2
3
提示:
1 <= k <= points.length <= 10^4-10^4 < xi, yi < 10^4
2. 🎯 s.1 - 排序
js
/**
* @param {number[][]} points
* @param {number} k
* @return {number[][]}
*/
var kClosest = function (points, k) {
// 按距离原点的平方从小到大排序(避免开方运算)
points.sort((a, b) => {
const distA = a[0] * a[0] + a[1] * a[1]
const distB = b[0] * b[0] + b[1] * b[1]
return distA - distB
})
// 返回前 k 个点
return points.slice(0, k)
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 时间复杂度:
,其中 n 是点的数量,主要开销在排序上 - 空间复杂度:
,排序算法的递归栈空间
算法思路:
- 距离计算:计算每个点到原点的距离平方
,避免开方运算提高效率 - 排序:按距离平方从小到大对所有点进行排序
- 截取结果:排序后取前 k 个点即为答案
- 优化点:由于只需比较距离大小,不需要计算实际距离,使用距离平方即可
- 返回值:直接返回排序后的前 k 个点,顺序不重要