Skip to content

Commit bbaeec0

Browse files
committed
五刷215
1 parent 380f4f4 commit bbaeec0

File tree

4 files changed

+89
-35
lines changed

4 files changed

+89
-35
lines changed

docs/0215-kth-largest-element-in-an-array.adoc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,15 @@ include::{sourcedir}/_0215_KthLargestElementInAnArray_3.java[tag=answer]
7474
include::{sourcedir}/_0215_KthLargestElementInAnArray_4.java[tag=answer]
7575
----
7676
--
77+
78+
五刷::
79+
+
80+
--
81+
[{java_src_attr}]
82+
----
83+
include::{sourcedir}/_0215_KthLargestElementInAnArray_5.java[tag=answer]
84+
----
85+
--
7786
====
7887

7988
== 参考资料

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ endif::[]
115115
|{doc_base_url}/0206-reverse-linked-list.adoc[题解]
116116
|✅ 两种解法:递归+迭代
117117

118+
|{counter:codes2503}
119+
|{leetcode_base_url}/kth-largest-element-in-an-array/[215. 数组中的第K个最大元素^]
120+
|{doc_base_url}/0215-kth-largest-element-in-an-array.adoc[题解]
121+
|✅ 快速选择
122+
118123
|===
119124

120125
截止目前,本轮练习一共完成 {codes2503} 道题。

src/main/java/com/diguage/algo/leetcode/_0215_KthLargestElementInAnArray_4.java

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,44 @@
22

33
public class _0215_KthLargestElementInAnArray_4 {
44
// tag::answer[]
5-
/**
6-
* @author D瓜哥 · https://www.diguage.com
7-
* @since 2025-03-26 16:24:19
8-
*/
9-
public int findKthLargest(int[] nums, int k) {
10-
// 第 k 大的元素,正好是升序数组的 nums.length - k 个元素
11-
return quickselect(nums, nums.length - k, 0, nums.length - 1);
12-
}
13-
14-
private int quickselect(int[] nums, int k, int left, int right) {
15-
if (left == right) {
16-
return nums[k];
5+
/**
6+
* @author D瓜哥 · https://www.diguage.com
7+
* @since 2025-03-26 16:24:19
8+
*/
9+
public int findKthLargest(int[] nums, int k) {
10+
// 第 k 大的元素,正好是升序数组的 nums.length - k 个元素
11+
return quickselect(nums, nums.length - k, 0, nums.length - 1);
1712
}
18-
int pivot = nums[left];
19-
// 由于下面先移动指针,所以左右指针各项左右移一位
20-
int l = left - 1, r = right + 1;
21-
while (l < r) {
22-
// 交换之后,没有移动指针,所以先移动指针再循环
23-
do {
24-
l++;
25-
} while (nums[l] < pivot);
26-
do {
27-
r--;
28-
} while (pivot < nums[r]);
29-
if (l < r) {
30-
int tmp = nums[l];
31-
nums[l] = nums[r];
32-
nums[r] = tmp;
13+
14+
private int quickselect(int[] nums, int k, int left, int right) {
15+
if (left == right) {
16+
return nums[k];
17+
}
18+
int pivot = nums[left];
19+
// 由于下面先移动指针,所以左右指针各项左右移一位
20+
int l = left - 1, r = right + 1;
21+
while (l < r) {
22+
// 交换之后,没有移动指针,所以先移动指针再循环
23+
do {
24+
l++;
25+
} while (nums[l] < pivot);
26+
do {
27+
r--;
28+
} while (pivot < nums[r]);
29+
if (l < r) {
30+
int tmp = nums[l];
31+
nums[l] = nums[r];
32+
nums[r] = tmp;
33+
}
34+
}
35+
// r 是最后一个小于或等于 pivot 的元素的索引。
36+
// [left, r] 是确定小于或等于 pivot 的部分。
37+
if (k <= r) {
38+
return quickselect(nums, k, left, r);
39+
} else {
40+
return quickselect(nums, k, r + 1, right);
3341
}
3442
}
35-
// r 是最后一个小于或等于 pivot 的元素的索引。
36-
// [left, r] 是确定小于或等于 pivot 的部分。
37-
if (k <= r) {
38-
return quickselect(nums, k, left, r);
39-
} else {
40-
return quickselect(nums, k, r + 1, right);
41-
}
42-
}
4343
// end::answer[]
4444

4545
public static void main(String[] args) {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.diguage.algo.leetcode;
2+
3+
public class _0215_KthLargestElementInAnArray_5 {
4+
// tag::answer[]
5+
6+
/**
7+
* @author D瓜哥 · https://www.diguage.com
8+
* @since 2025-04-02 15:49:20
9+
*/
10+
public int findKthLargest(int[] nums, int k) {
11+
return quickSelect(nums, nums.length - k, 0, nums.length - 1);
12+
}
13+
14+
private int quickSelect(int[] nums, int k, int left, int right) {
15+
if (left >= right) {
16+
return nums[k];
17+
}
18+
int pivot = nums[left];
19+
int l = left - 1, r = right + 1;
20+
while (l < r) {
21+
do {
22+
l++;
23+
} while (nums[l] < pivot);
24+
do {
25+
r--;
26+
} while (pivot < nums[r]);
27+
if (l < r) {
28+
int tmp = nums[l];
29+
nums[l] = nums[r];
30+
nums[r] = tmp;
31+
}
32+
}
33+
if (k <= r) {
34+
return quickSelect(nums, k, left, r);
35+
} else {
36+
return quickSelect(nums, k, r + 1, right);
37+
}
38+
}
39+
// end::answer[]
40+
}

0 commit comments

Comments
 (0)