Skip to content

Commit 3b14269

Browse files
committed
一刷973
1 parent 608fd7d commit 3b14269

7 files changed

Lines changed: 171 additions & 41 deletions

File tree

README.adoc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6835,14 +6835,14 @@ TIP: **公众号的微信号是: `jikerizhi`**。__因为众所周知的原因
68356835
//|{doc_base_url}/0972-equal-rational-numbers.adoc[题解]
68366836
//|Hard
68376837
//|
6838-
//
6839-
//|{counter:codes}
6840-
//|{leetcode_base_url}/k-closest-points-to-origin/[973. K Closest Points to Origin^]
6841-
//|{source_base_url}/_0973_KClosestPointsToOrigin.java[Java]
6842-
//|{doc_base_url}/0973-k-closest-points-to-origin.adoc[题解]
6843-
//|Medium
6844-
//|
6845-
//
6838+
6839+
|{counter:codes}
6840+
|{leetcode_base_url}/k-closest-points-to-origin/[973. K Closest Points to Origin^]
6841+
|{source_base_url}/_0973_KClosestPointsToOrigin.java[Java]
6842+
|{doc_base_url}/0973-k-closest-points-to-origin.adoc[题解]
6843+
|Medium
6844+
|
6845+
68466846
//|{counter:codes}
68476847
//|{leetcode_base_url}/subarray-sums-divisible-by-k/[974. Subarray Sums Divisible by K^]
68486848
//|{source_base_url}/_0974_SubarraySumsDivisibleByK.java[Java]
Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,74 @@
11
[#0973-k-closest-points-to-origin]
2-
= 973. K Closest Points to Origin
2+
= 973. 最接近原点的 K 个点
33

4-
{leetcode}/problems/k-closest-points-to-origin/[LeetCode - K Closest Points to Origin^]
4+
https://leetcode.cn/problems/k-closest-points-to-origin/[LeetCode - 973. 最接近原点的 K 个点^]
55

6-
We have a list of `points` on the plane. Find the `K` closest points to the origin `(0, 0)`.
6+
给定一个数组 `points`,其中 `points[i] = [x~i~, y~i~]` 表示 *X-Y* 平面上的一个点,并且是一个整数 `k`,返回离原点 `(0, 0)` 最近的 `k` 个点。
77

8-
(Here, the distance between two points on a plane is the Euclidean distance.)
8+
这里,平面上两点之间的距离是 *欧几里德距离* stem:[\sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}]。
99

10-
You may return the answer in any order. The answer is guaranteed to be unique (except for the order that it is in.)
10+
你可以按 *任何顺序* 返回答案。除了点坐标的顺序之外,答案 *确保**唯一* 的。
1111

12-
12+
*示例 1:*
1313

14+
image::images/0973-01.jpg[{image_attr}]
1415

15-
*Example 1:*
16-
17-
[subs="verbatim,quotes,macros"]
18-
----
19-
*Input:* points = [[1,3],[-2,2]], K = 1
20-
*Output:* [[-2,2]]
21-
*Explanation:*
22-
The distance between (1, 3) and the origin is sqrt(10).
23-
The distance between (-2, 2) and the origin is sqrt(8).
24-
Since sqrt(8) < sqrt(10), (-2, 2) is closer to the origin.
25-
We only want the closest K = 1 points from the origin, so the answer is just [[-2,2]].
26-
----
16+
....
17+
输入:points = [[1,3],[-2,2]], k = 1
18+
输出:[[-2,2]]
19+
解释:
20+
(1, 3) 和原点之间的距离为 sqrt(10),
21+
(-2, 2) 和原点之间的距离为 sqrt(8),
22+
由于 sqrt(8) < sqrt(10),(-2, 2) 离原点更近。
23+
我们只需要距离原点最近的 K = 1 个点,所以答案就是 [[-2,2]]。
24+
....
2725

26+
*示例 2:*
2827

29-
*Example 2:*
30-
31-
[subs="verbatim,quotes,macros"]
32-
----
33-
*Input:* points = [[3,3],[5,-1],[-2,4]], K = 2
34-
*Output:* [[3,3],[-2,4]]
35-
(The answer [[-2,4],[3,3]] would also be accepted.)
36-
----
28+
....
29+
输入:points = [[3,3],[5,-1],[-2,4]], k = 2
30+
输出:[[3,3],[-2,4]]
31+
(答案 [[-2,4],[3,3]] 也会被接受。)
32+
....
3733

38-
34+
*提示:*
3935

40-
*Note:*
36+
* `1 \<= k \<= points.length \<= 10^4^`
37+
* `-10^4^ < x~i~, y~i~ < 10^4^`
4138
4239
43-
. `1 <= K <= points.length <= 10000`
44-
. `-10000 < points[i][0] < 10000`
45-
. `-10000 < points[i][1] < 10000`
46-
4740
41+
== 思路分析
4842

43+
排序,堆,快速选择等多种解法均可。
4944

45+
WARNING: 快速选择写的还是漏洞百出!!
5046

5147
[[src-0973]]
48+
[tabs]
49+
====
50+
一刷::
51+
+
52+
--
5253
[{java_src_attr}]
5354
----
5455
include::{sourcedir}/_0973_KClosestPointsToOrigin.java[tag=answer]
5556
----
57+
--
58+
59+
// 二刷::
60+
// +
61+
// --
62+
// [{java_src_attr}]
63+
// ----
64+
// include::{sourcedir}/_0973_KClosestPointsToOrigin_2.java[tag=answer]
65+
// ----
66+
// --
67+
====
68+
69+
70+
== 参考资料
71+
72+
. https://leetcode.cn/problems/k-closest-points-to-origin/solutions/478516/kuai-lai-miao-dong-topkkuai-pai-bian-xing-da-gen-d/[973. 最接近原点的 K 个点 - 快来秒懂 TopK!快排变形 & 大根堆^]
73+
. https://leetcode.cn/problems/k-closest-points-to-origin/solutions/477916/zui-jie-jin-yuan-dian-de-k-ge-dian-by-leetcode-sol/[973. 最接近原点的 K 个点 - 官方题解^]
5674

docs/images/0973-01.jpg

17 KB
Loading

docs/index.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2038,7 +2038,7 @@ include::0946-validate-stack-sequences.adoc[leveloffset=+1]
20382038

20392039
// include::0972-equal-rational-numbers.adoc[leveloffset=+1]
20402040

2041-
// include::0973-k-closest-points-to-origin.adoc[leveloffset=+1]
2041+
include::0973-k-closest-points-to-origin.adoc[leveloffset=+1]
20422042

20432043
// include::0974-subarray-sums-divisible-by-k.adoc[leveloffset=+1]
20442044

logbook/202601.adoc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,6 +1236,12 @@ endif::[]
12361236
|{doc_base_url}/0154-find-minimum-in-rotated-sorted-array-ii.adoc[题解]
12371237
|⭕️ 二分查找。重点要看,你关注的点在哪里,如果简化判定。
12381238

1239+
|{counter:codes}
1240+
|{leetcode_base_url}/k-closest-points-to-origin/[973. 最接近原点的 K 个点^]
1241+
|{doc_base_url}/0973-k-closest-points-to-origin.adoc[题解]
1242+
|⭕️ 快速选择!快速选择还是写的漏洞百出!
1243+
1244+
12391245
|===
12401246

12411247

logbook/corrections.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,6 +1298,11 @@ endif::[]
12981298
|{doc_base_url}/0886-possible-bipartition.adoc[题解]
12991299
|❌
13001300

1301+
|{counter:codes}
1302+
|{leetcode_base_url}/k-closest-points-to-origin/[973. 最接近原点的 K 个点^]
1303+
|{doc_base_url}/0973-k-closest-points-to-origin.adoc[题解]
1304+
|⭕️
1305+
13011306
|===
13021307

13031308
截止目前,本轮练习一共完成 {corrections} 道题。
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.Arrays;
4+
5+
public class _0973_KClosestPointsToOrigin {
6+
// tag::answer[]
7+
/**
8+
* @author D瓜哥 · https://www.diguage.com
9+
* @since 2026-08-29 21:55:28
10+
*/
11+
public int[][] kClosest(int[][] points, int k) {
12+
quickSelect(points, k - 1, 0, points.length - 1);
13+
return Arrays.copyOfRange(points, 0, k);
14+
}
15+
16+
private void quickSelect(int[][] points, int idx, int left, int right) {
17+
if (left >= right) {
18+
return;
19+
}
20+
int p = partittion(points, left, right);
21+
if (p == idx) {
22+
return;
23+
}
24+
if (p < idx) {
25+
quickSelect(points, idx, p + 1, right);
26+
} else {
27+
quickSelect(points, idx, left, p - 1);
28+
}
29+
}
30+
31+
private int partittion(int[][] points, int left, int right) {
32+
int[] v = points[left];
33+
int dist = v[0] * v[0] + v[1] * v[1];
34+
int l = left, r = right + 1;
35+
while (l <= r) {
36+
while (++l <= right && points[l][0] * points[l][0] + points[l][1] * points[l][1] < dist) {
37+
}
38+
while (left <= --r && points[r][0] * points[r][0] + points[r][1] * points[r][1] > dist) {
39+
}
40+
if (l >= r) {
41+
break;
42+
}
43+
swap(points, l, r);
44+
}
45+
points[left] = points[r];
46+
points[r] = v;
47+
return r;
48+
}
49+
50+
private void swap(int[][] points, int a, int b) {
51+
int[] tmp = points[a];
52+
points[a] = points[b];
53+
points[b] = tmp;
54+
}
55+
// end::answer[]
56+
// public int[][] kClosest(int[][] points, int k) {
57+
// quickSort(points, k, 0, points.length - 1);
58+
// int[][] result = new int[k][2];
59+
// System.arraycopy(points, 0, result, 0, k);
60+
// return result;
61+
// }
62+
//
63+
// private void quickSort(int[][] nums, int k, int left, int right) {
64+
// if (left >= right) {
65+
// return;
66+
// }
67+
// int l = left, r = right;
68+
// int pivot = left + ((right - left) / 2);
69+
// int pn = nums[pivot][0] * nums[pivot][0] + nums[pivot][1] * nums[pivot][1];
70+
// while (l <= r) {
71+
// while (l < r
72+
// && nums[l][0] * nums[l][0] + nums[l][1] * nums[l][1] < pn) {
73+
// l++;
74+
// }
75+
// while (l < r
76+
// && pn < nums[r][0] * nums[r][0] + nums[r][1] * nums[r][1]) {
77+
// r--;
78+
// }
79+
// if (l <= r) {
80+
// int[] temp = nums[l];
81+
// nums[l] = nums[r];
82+
// nums[r] = temp;
83+
// l++;
84+
// r--;
85+
// }
86+
//
87+
// }
88+
// if (k <= r) {
89+
// quickSort(nums, k, left, r);
90+
// } else if (k >= l) {
91+
// quickSort(nums, k, l, right);
92+
// }
93+
// }
94+
// end::answer[]
95+
96+
static void main() {
97+
new _0973_KClosestPointsToOrigin()
98+
.kClosest(new int[][]{{3, 3}, {5, -1}, {-2, 4}}, 1);
99+
// .kClosest(new int[][]{{1, 3}, {-2, 2}}, 1);
100+
}
101+
}

0 commit comments

Comments
 (0)