Skip to content

Commit ec67111

Browse files
committed
feat(heap): ✨分治法优化973
1 parent b5cc742 commit ec67111

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

Heap/973/solution2.js

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* https://leetcode-cn.com/problems/k-closest-points-to-origin/submissions/
3+
*
4+
* 973. 最接近原点的 K 个点
5+
*
6+
* Medium
7+
*
8+
* 192ms 100.00%
9+
* 48mb 70%
10+
*
11+
* O(n)
12+
*/
13+
const kClosest = (points, K) => {
14+
if (K === points.length) {
15+
return points;
16+
}
17+
findKClosest(points, 0, points.length - 1, K);
18+
return points.slice(0, K);
19+
}
20+
21+
function swap(points, i, j) {
22+
if (i === j) {
23+
return;
24+
}
25+
const divisionPoint = points[i];
26+
points[i] = points[j];
27+
points[j] = divisionPoint;
28+
}
29+
30+
function getDistance(points) {
31+
const [x, y] = points;
32+
// 这里没必要取根号,可以节省点时间复杂度
33+
return x ** 2 + y ** 2;
34+
}
35+
36+
function findKClosest(points, startIndex, endIndex, K) {
37+
if (startIndex > endIndex) {
38+
return;
39+
}
40+
41+
const startItemDistance = getDistance(points[startIndex]);
42+
43+
let divisionPoint = startIndex;
44+
45+
swap(points, startIndex, endIndex);
46+
47+
for (let i = startIndex; i < endIndex; i++) {
48+
if (getDistance(points[i]) < startItemDistance) {
49+
swap(points, i, divisionPoint);
50+
divisionPoint++;
51+
}
52+
}
53+
swap(points, divisionPoint, endIndex);
54+
55+
if (divisionPoint + 1 === K) {
56+
return
57+
} else if (divisionPoint + 1 < K) {
58+
findKClosest(points, divisionPoint + 1, endIndex, K);
59+
} else {
60+
findKClosest(points, startIndex, divisionPoint - 1, K);
61+
}
62+
}

0 commit comments

Comments
 (0)