Skip to content

Commit 83afc09

Browse files
committed
feat: add solutions to lcof2 problem: No.076. Kth Largest Element in an Array
1 parent c25f5c7 commit 83afc09

File tree

9 files changed

+248
-46
lines changed

9 files changed

+248
-46
lines changed

lcof2/剑指 Offer II 076. 数组中的第 k 大的数字/README.md

+116-1
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,137 @@
4141

4242
<!-- 这里可写通用的实现逻辑 -->
4343

44+
快速排序 partition 实现。
45+
4446
<!-- tabs:start -->
4547

4648
### **Python3**
4749

4850
<!-- 这里可写当前语言的特殊实现逻辑 -->
4951

5052
```python
51-
53+
class Solution:
54+
def findKthLargest(self, nums: List[int], k: int) -> int:
55+
def quick_sort(left, right, k):
56+
if left == right:
57+
return nums[left]
58+
i, j = left - 1, right + 1
59+
x = nums[(left + right) >> 1]
60+
while i < j:
61+
while 1:
62+
i += 1
63+
if nums[i] >= x:
64+
break
65+
while 1:
66+
j -= 1
67+
if nums[j] <= x:
68+
break
69+
if i < j:
70+
nums[i], nums[j] = nums[j], nums[i]
71+
if j < k:
72+
return quick_sort(j + 1, right, k)
73+
return quick_sort(left, j, k)
74+
75+
n = len(nums)
76+
return quick_sort(0, n - 1, n - k)
5277
```
5378

5479
### **Java**
5580

5681
<!-- 这里可写当前语言的特殊实现逻辑 -->
5782

5883
```java
84+
class Solution {
85+
public int findKthLargest(int[] nums, int k) {
86+
int n = nums.length;
87+
return quickSort(nums, 0, n - 1, n - k);
88+
}
89+
90+
private int quickSort(int[] nums, int left, int right, int k) {
91+
if (left == right) {
92+
return nums[left];
93+
}
94+
int i = left - 1, j = right + 1;
95+
int x = nums[(left + right) >>> 1];
96+
while (i < j) {
97+
while (nums[++i] < x);
98+
while (nums[--j] > x);
99+
if (i < j) {
100+
int t = nums[i];
101+
nums[i] = nums[j];
102+
nums[j] = t;
103+
}
104+
}
105+
if (j < k) {
106+
return quickSort(nums, j + 1, right, k);
107+
}
108+
return quickSort(nums, left, j, k);
109+
110+
}
111+
}
112+
```
113+
114+
### **C++**
115+
116+
```cpp
117+
class Solution {
118+
public:
119+
int findKthLargest(vector<int>& nums, int k) {
120+
int n = nums.size();
121+
return quickSort(nums, 0, n - 1, n - k);
122+
}
123+
124+
int quickSort(vector<int>& nums, int left, int right, int k) {
125+
if (left == right) return nums[left];
126+
int i = left - 1, j = right + 1;
127+
int x = nums[left + right >> 1];
128+
while (i < j)
129+
{
130+
while (nums[++i] < x);
131+
while (nums[--j] > x);
132+
if (i < j) swap(nums[i], nums[j]);
133+
}
134+
return j < k ? quickSort(nums, j + 1, right, k) : quickSort(nums, left, j, k);
135+
}
136+
};
137+
```
59138

139+
### **Go**
140+
141+
```go
142+
func findKthLargest(nums []int, k int) int {
143+
n := len(nums)
144+
return quickSort(nums, 0, n-1, n-k)
145+
}
146+
147+
func quickSort(nums []int, left, right, k int) int {
148+
if left == right {
149+
return nums[left]
150+
}
151+
i, j := left-1, right+1
152+
x := nums[(left+right)>>1]
153+
for i < j {
154+
for {
155+
i++
156+
if nums[i] >= x {
157+
break
158+
}
159+
}
160+
for {
161+
j--
162+
if nums[j] <= x {
163+
break
164+
}
165+
}
166+
if i < j {
167+
nums[i], nums[j] = nums[j], nums[i]
168+
}
169+
}
170+
if j < k {
171+
return quickSort(nums, j+1, right, k)
172+
}
173+
return quickSort(nums, left, j, k)
174+
}
60175
```
61176

62177
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int findKthLargest(vector<int>& nums, int k) {
4+
int n = nums.size();
5+
return quickSort(nums, 0, n - 1, n - k);
6+
}
7+
8+
int quickSort(vector<int>& nums, int left, int right, int k) {
9+
if (left == right) return nums[left];
10+
int i = left - 1, j = right + 1;
11+
int x = nums[left + right >> 1];
12+
while (i < j)
13+
{
14+
while (nums[++i] < x);
15+
while (nums[--j] > x);
16+
if (i < j) swap(nums[i], nums[j]);
17+
}
18+
return j < k ? quickSort(nums, j + 1, right, k) : quickSort(nums, left, j, k);
19+
}
20+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
func findKthLargest(nums []int, k int) int {
2+
n := len(nums)
3+
return quickSort(nums, 0, n-1, n-k)
4+
}
5+
6+
func quickSort(nums []int, left, right, k int) int {
7+
if left == right {
8+
return nums[left]
9+
}
10+
i, j := left-1, right+1
11+
x := nums[(left+right)>>1]
12+
for i < j {
13+
for {
14+
i++
15+
if nums[i] >= x {
16+
break
17+
}
18+
}
19+
for {
20+
j--
21+
if nums[j] <= x {
22+
break
23+
}
24+
}
25+
if i < j {
26+
nums[i], nums[j] = nums[j], nums[i]
27+
}
28+
}
29+
if j < k {
30+
return quickSort(nums, j+1, right, k)
31+
}
32+
return quickSort(nums, left, j, k)
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public int findKthLargest(int[] nums, int k) {
3+
int n = nums.length;
4+
return quickSort(nums, 0, n - 1, n - k);
5+
}
6+
7+
private int quickSort(int[] nums, int left, int right, int k) {
8+
if (left == right) {
9+
return nums[left];
10+
}
11+
int i = left - 1, j = right + 1;
12+
int x = nums[(left + right) >>> 1];
13+
while (i < j) {
14+
while (nums[++i] < x);
15+
while (nums[--j] > x);
16+
if (i < j) {
17+
int t = nums[i];
18+
nums[i] = nums[j];
19+
nums[j] = t;
20+
}
21+
}
22+
if (j < k) {
23+
return quickSort(nums, j + 1, right, k);
24+
}
25+
return quickSort(nums, left, j, k);
26+
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution:
2+
def findKthLargest(self, nums: List[int], k: int) -> int:
3+
def quick_sort(left, right, k):
4+
if left == right:
5+
return nums[left]
6+
i, j = left - 1, right + 1
7+
x = nums[(left + right) >> 1]
8+
while i < j:
9+
while 1:
10+
i += 1
11+
if nums[i] >= x:
12+
break
13+
while 1:
14+
j -= 1
15+
if nums[j] <= x:
16+
break
17+
if i < j:
18+
nums[i], nums[j] = nums[j], nums[i]
19+
if j < k:
20+
return quick_sort(j + 1, right, k)
21+
return quick_sort(left, j, k)
22+
23+
n = len(nums)
24+
return quick_sort(0, n - 1, n - k)

solution/0200-0299/0215.Kth Largest Element in an Array/README.md

+9-15
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
```python
4040
class Solution:
4141
def findKthLargest(self, nums: List[int], k: int) -> int:
42-
def quickSort(nums, left, right, k):
42+
def quick_sort(left, right, k):
4343
if left == right:
4444
return nums[left]
4545
i, j = left - 1, right + 1
@@ -56,11 +56,11 @@ class Solution:
5656
if i < j:
5757
nums[i], nums[j] = nums[j], nums[i]
5858
if j < k:
59-
return quickSort(nums, j + 1, right, k)
60-
return quickSort(nums, left, j, k)
59+
return quick_sort(j + 1, right, k)
60+
return quick_sort(left, j, k)
6161

6262
n = len(nums)
63-
return quickSort(nums, 0, n - 1, n - k)
63+
return quick_sort(0, n - 1, n - k)
6464
```
6565

6666
### **Java**
@@ -109,22 +109,16 @@ public:
109109
}
110110

111111
int quickSort(vector<int>& nums, int left, int right, int k) {
112-
if (left == right) {
113-
return nums[left];
114-
}
112+
if (left == right) return nums[left];
115113
int i = left - 1, j = right + 1;
116114
int x = nums[left + right >> 1];
117-
while (i < j) {
115+
while (i < j)
116+
{
118117
while (nums[++i] < x);
119118
while (nums[--j] > x);
120-
if (i < j) {
121-
swap(nums[i], nums[j]);
122-
}
119+
if (i < j) swap(nums[i], nums[j]);
123120
}
124-
if (j < k) {
125-
return quickSort(nums, j + 1, right, k);
126-
}
127-
return quickSort(nums, left, j, k);
121+
return j < k ? quickSort(nums, j + 1, right, k) : quickSort(nums, left, j, k);
128122
}
129123
};
130124
```

solution/0200-0299/0215.Kth Largest Element in an Array/README_EN.md

+9-15
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
```python
3535
class Solution:
3636
def findKthLargest(self, nums: List[int], k: int) -> int:
37-
def quickSort(nums, left, right, k):
37+
def quick_sort(left, right, k):
3838
if left == right:
3939
return nums[left]
4040
i, j = left - 1, right + 1
@@ -51,11 +51,11 @@ class Solution:
5151
if i < j:
5252
nums[i], nums[j] = nums[j], nums[i]
5353
if j < k:
54-
return quickSort(nums, j + 1, right, k)
55-
return quickSort(nums, left, j, k)
54+
return quick_sort(j + 1, right, k)
55+
return quick_sort(left, j, k)
5656

5757
n = len(nums)
58-
return quickSort(nums, 0, n - 1, n - k)
58+
return quick_sort(0, n - 1, n - k)
5959
```
6060

6161
### **Java**
@@ -102,22 +102,16 @@ public:
102102
}
103103

104104
int quickSort(vector<int>& nums, int left, int right, int k) {
105-
if (left == right) {
106-
return nums[left];
107-
}
105+
if (left == right) return nums[left];
108106
int i = left - 1, j = right + 1;
109107
int x = nums[left + right >> 1];
110-
while (i < j) {
108+
while (i < j)
109+
{
111110
while (nums[++i] < x);
112111
while (nums[--j] > x);
113-
if (i < j) {
114-
swap(nums[i], nums[j]);
115-
}
112+
if (i < j) swap(nums[i], nums[j]);
116113
}
117-
if (j < k) {
118-
return quickSort(nums, j + 1, right, k);
119-
}
120-
return quickSort(nums, left, j, k);
114+
return j < k ? quickSort(nums, j + 1, right, k) : quickSort(nums, left, j, k);
121115
}
122116
};
123117
```

solution/0200-0299/0215.Kth Largest Element in an Array/Solution.cpp

+5-11
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,15 @@ class Solution {
66
}
77

88
int quickSort(vector<int>& nums, int left, int right, int k) {
9-
if (left == right) {
10-
return nums[left];
11-
}
9+
if (left == right) return nums[left];
1210
int i = left - 1, j = right + 1;
1311
int x = nums[left + right >> 1];
14-
while (i < j) {
12+
while (i < j)
13+
{
1514
while (nums[++i] < x);
1615
while (nums[--j] > x);
17-
if (i < j) {
18-
swap(nums[i], nums[j]);
19-
}
20-
}
21-
if (j < k) {
22-
return quickSort(nums, j + 1, right, k);
16+
if (i < j) swap(nums[i], nums[j]);
2317
}
24-
return quickSort(nums, left, j, k);
18+
return j < k ? quickSort(nums, j + 1, right, k) : quickSort(nums, left, j, k);
2519
}
2620
};

0 commit comments

Comments
 (0)