Skip to content

Commit c41240e

Browse files
committed
feat: update solutions to lcof problems: No.40,41
- 面试题40. 最小的k个数 - 面试题41. 数据流中的中位数
1 parent f1c34bc commit c41240e

File tree

6 files changed

+158
-50
lines changed

6 files changed

+158
-50
lines changed

lcof/面试题40. 最小的k个数/README.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,65 @@ public:
160160
};
161161
```
162162

163+
### **TypeScript**
164+
165+
```ts
166+
function getLeastNumbers(arr: number[], k: number): number[] {
167+
let start = 0;
168+
let end = arr.length;
169+
while (start < end && end > k) {
170+
const index = start + Math.floor(Math.random() * (end - start));
171+
[arr[start], arr[index]] = [arr[index], arr[start]];
172+
const num = arr[start];
173+
let mark = start;
174+
for (let i = start + 1; i < end; i++) {
175+
if (arr[i] < num) {
176+
mark++;
177+
[arr[i], arr[mark]] = [arr[mark], arr[i]];
178+
}
179+
}
180+
[arr[start], arr[mark]] = [arr[mark], arr[start]];
181+
182+
if (mark >= k) {
183+
end = mark;
184+
} else {
185+
start = mark + 1;
186+
}
187+
}
188+
return arr.slice(0, k);
189+
}
190+
```
191+
192+
### **Rust**
193+
194+
```rust
195+
impl Solution {
196+
pub fn get_least_numbers(mut arr: Vec<i32>, k: i32) -> Vec<i32> {
197+
let k = k as usize;
198+
let mut start = 0;
199+
let mut end = arr.len();
200+
while start < end && end > k {
201+
let num = arr[start];
202+
let mut mark = start;
203+
for i in (start + 1)..end {
204+
if arr[i] < num {
205+
mark += 1;
206+
arr.swap(i, mark);
207+
}
208+
}
209+
arr.swap(start, mark);
210+
211+
if mark <= k {
212+
start = mark + 1;
213+
} else {
214+
end = mark
215+
}
216+
}
217+
arr[0..k].to_vec()
218+
}
219+
}
220+
```
221+
163222
### **...**
164223

165224
```
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
impl Solution {
2+
pub fn get_least_numbers(mut arr: Vec<i32>, k: i32) -> Vec<i32> {
3+
let k = k as usize;
4+
let mut start = 0;
5+
let mut end = arr.len();
6+
while start < end && end > k {
7+
let num = arr[start];
8+
let mut mark = start;
9+
for i in (start + 1)..end {
10+
if arr[i] < num {
11+
mark += 1;
12+
arr.swap(i, mark);
13+
}
14+
}
15+
arr.swap(start, mark);
16+
17+
if mark <= k {
18+
start = mark + 1;
19+
} else {
20+
end = mark
21+
}
22+
}
23+
arr[0..k].to_vec()
24+
}
25+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
function getLeastNumbers(arr: number[], k: number): number[] {
2+
let start = 0;
3+
let end = arr.length;
4+
while (start < end && end > k) {
5+
const index = start + Math.floor(Math.random() * (end - start));
6+
[arr[start], arr[index]] = [arr[index], arr[start]];
7+
const num = arr[start];
8+
let mark = start;
9+
for (let i = start + 1; i < end; i++) {
10+
if (arr[i] < num) {
11+
mark++;
12+
[arr[i], arr[mark]] = [arr[mark], arr[i]];
13+
}
14+
}
15+
[arr[start], arr[mark]] = [arr[mark], arr[start]];
16+
17+
if (mark >= k) {
18+
end = mark;
19+
} else {
20+
start = mark + 1;
21+
}
22+
}
23+
return arr.slice(0, k);
24+
}

lcof/面试题41. 数据流中的中位数/README.md

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -209,32 +209,34 @@ private:
209209

210210
```ts
211211
class MedianFinder {
212-
public arr: number[] = [];
212+
private nums: number[];
213213

214-
constructor() {}
214+
constructor() {
215+
this.nums = [];
216+
}
215217

216218
addNum(num: number): void {
217-
const { arr } = this;
219+
const { nums } = this;
218220
let l = 0;
219-
let r = arr.length - 1;
220-
while (l <= r) {
221-
const mid = (l + r) >> 1;
222-
if (arr[mid] < num) {
221+
let r = nums.length;
222+
while (l < r) {
223+
const mid = (l + r) >>> 1;
224+
if (nums[mid] < num) {
223225
l = mid + 1;
224226
} else {
225-
r = mid - 1;
227+
r = mid;
226228
}
227229
}
228-
arr.splice(l, 0, num);
230+
nums.splice(l, 0, num);
229231
}
230232

231233
findMedian(): number {
232-
const { arr } = this;
233-
const n = arr.length;
234-
if (n % 2 === 0) {
235-
return (arr[n >> 1] + arr[(n >> 1) - 1]) / 2;
234+
const { nums } = this;
235+
const n = nums.length;
236+
if ((n & 1) === 1) {
237+
return nums[n >> 1];
236238
}
237-
return arr[n >> 1];
239+
return (nums[n >> 1] + nums[(n >> 1) - 1]) / 2;
238240
}
239241
}
240242

@@ -250,7 +252,7 @@ class MedianFinder {
250252

251253
```rust
252254
struct MedianFinder {
253-
arr: Vec<i32>,
255+
nums: Vec<i32>,
254256
}
255257

256258
/**
@@ -260,31 +262,29 @@ struct MedianFinder {
260262
impl MedianFinder {
261263
/** initialize your data structure here. */
262264
fn new() -> Self {
263-
MedianFinder {
264-
arr: vec![]
265-
}
265+
Self { nums: Vec::new() }
266266
}
267267

268268
fn add_num(&mut self, num: i32) {
269269
let mut l = 0;
270-
let mut r = self.arr.len();
270+
let mut r = self.nums.len();
271271
while l < r {
272272
let mid = l + r >> 1;
273-
if self.arr[mid] < num {
273+
if self.nums[mid] < num {
274274
l = mid + 1;
275275
} else {
276276
r = mid;
277277
}
278278
}
279-
self.arr.splice(l..l, [num]);
279+
self.nums.insert(l, num);
280280
}
281281

282282
fn find_median(&self) -> f64 {
283-
let n = self.arr.len();
284-
match n % 2 == 0 {
285-
true => f64::from(self.arr[n >> 1] + self.arr[(n >> 1) - 1]) / 2.0,
286-
false => f64::from(self.arr[n >> 1]),
283+
let n = self.nums.len();
284+
if (n & 1) == 1 {
285+
return f64::from(self.nums[n >> 1]);
287286
}
287+
f64::from(self.nums[n >> 1] + self.nums[(n >> 1) - 1]) / 2.0
288288
}
289289
}
290290

lcof/面试题41. 数据流中的中位数/Solution.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
struct MedianFinder {
2-
arr: Vec<i32>,
2+
nums: Vec<i32>,
33
}
44

55
/**
@@ -9,31 +9,29 @@ struct MedianFinder {
99
impl MedianFinder {
1010
/** initialize your data structure here. */
1111
fn new() -> Self {
12-
MedianFinder {
13-
arr: vec![]
14-
}
12+
Self { nums: Vec::new() }
1513
}
1614

1715
fn add_num(&mut self, num: i32) {
1816
let mut l = 0;
19-
let mut r = self.arr.len();
17+
let mut r = self.nums.len();
2018
while l < r {
2119
let mid = l + r >> 1;
22-
if self.arr[mid] < num {
20+
if self.nums[mid] < num {
2321
l = mid + 1;
2422
} else {
2523
r = mid;
2624
}
2725
}
28-
self.arr.splice(l..l, [num]);
26+
self.nums.insert(l, num);
2927
}
3028

3129
fn find_median(&self) -> f64 {
32-
let n = self.arr.len();
33-
match n % 2 == 0 {
34-
true => f64::from(self.arr[n >> 1] + self.arr[(n >> 1) - 1]) / 2.0,
35-
false => f64::from(self.arr[n >> 1]),
30+
let n = self.nums.len();
31+
if (n & 1) == 1 {
32+
return f64::from(self.nums[n >> 1]);
3633
}
34+
f64::from(self.nums[n >> 1] + self.nums[(n >> 1) - 1]) / 2.0
3735
}
3836
}
3937

lcof/面试题41. 数据流中的中位数/Solution.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,32 @@
11
class MedianFinder {
2-
public arr: number[] = [];
2+
private nums: number[];
33

4-
constructor() {}
4+
constructor() {
5+
this.nums = [];
6+
}
57

68
addNum(num: number): void {
7-
const { arr } = this;
9+
const { nums } = this;
810
let l = 0;
9-
let r = arr.length - 1;
10-
while (l <= r) {
11-
const mid = (l + r) >> 1;
12-
if (arr[mid] < num) {
11+
let r = nums.length;
12+
while (l < r) {
13+
const mid = (l + r) >>> 1;
14+
if (nums[mid] < num) {
1315
l = mid + 1;
1416
} else {
15-
r = mid - 1;
17+
r = mid;
1618
}
1719
}
18-
arr.splice(l, 0, num);
20+
nums.splice(l, 0, num);
1921
}
2022

2123
findMedian(): number {
22-
const { arr } = this;
23-
const n = arr.length;
24-
if (n % 2 === 0) {
25-
return (arr[n >> 1] + arr[(n >> 1) - 1]) / 2;
24+
const { nums } = this;
25+
const n = nums.length;
26+
if ((n & 1) === 1) {
27+
return nums[n >> 1];
2628
}
27-
return arr[n >> 1];
29+
return (nums[n >> 1] + nums[(n >> 1) - 1]) / 2;
2830
}
2931
}
3032

0 commit comments

Comments
 (0)