Skip to content

Commit ac084bb

Browse files
authored
feat: add rust solution to lc problem: No.2040 (#4521)
No.2040.Kth Smallest Product of Two Sorted Arrays
1 parent 05ffb40 commit ac084bb

File tree

3 files changed

+172
-0
lines changed

3 files changed

+172
-0
lines changed

solution/2000-2099/2040.Kth Smallest Product of Two Sorted Arrays/README.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,65 @@ function kthSmallestProduct(nums1: number[], nums2: number[], k: number): number
356356
}
357357
```
358358

359+
#### Rust
360+
361+
```rust
362+
impl Solution {
363+
pub fn kth_smallest_product(nums1: Vec<i32>, nums2: Vec<i32>, k: i64) -> i64 {
364+
let m = nums1.len();
365+
let n = nums2.len();
366+
let a = nums1[0].abs().max(nums1[m - 1].abs()) as i64;
367+
let b = nums2[0].abs().max(nums2[n - 1].abs()) as i64;
368+
let mut l = -a * b;
369+
let mut r = a * b;
370+
371+
let count = |p: i64| -> i64 {
372+
let mut cnt = 0i64;
373+
for &x in &nums1 {
374+
if x > 0 {
375+
let mut left = 0;
376+
let mut right = n;
377+
while left < right {
378+
let mid = (left + right) / 2;
379+
if (x as i64) * (nums2[mid] as i64) > p {
380+
right = mid;
381+
} else {
382+
left = mid + 1;
383+
}
384+
}
385+
cnt += left as i64;
386+
} else if x < 0 {
387+
let mut left = 0;
388+
let mut right = n;
389+
while left < right {
390+
let mid = (left + right) / 2;
391+
if (x as i64) * (nums2[mid] as i64) <= p {
392+
right = mid;
393+
} else {
394+
left = mid + 1;
395+
}
396+
}
397+
cnt += (n - left) as i64;
398+
} else if p >= 0 {
399+
cnt += n as i64;
400+
}
401+
}
402+
cnt
403+
};
404+
405+
while l < r {
406+
let mid = l + (r - l) / 2;
407+
if count(mid) >= k {
408+
r = mid;
409+
} else {
410+
l = mid + 1;
411+
}
412+
}
413+
l
414+
}
415+
}
416+
```
417+
359418
<!-- tabs:end -->
360419

361420
<!-- solution:end -->

solution/2000-2099/2040.Kth Smallest Product of Two Sorted Arrays/README_EN.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,65 @@ function kthSmallestProduct(nums1: number[], nums2: number[], k: number): number
357357
}
358358
```
359359

360+
#### Rust
361+
362+
```rust
363+
impl Solution {
364+
pub fn kth_smallest_product(nums1: Vec<i32>, nums2: Vec<i32>, k: i64) -> i64 {
365+
let m = nums1.len();
366+
let n = nums2.len();
367+
let a = nums1[0].abs().max(nums1[m - 1].abs()) as i64;
368+
let b = nums2[0].abs().max(nums2[n - 1].abs()) as i64;
369+
let mut l = -a * b;
370+
let mut r = a * b;
371+
372+
let count = |p: i64| -> i64 {
373+
let mut cnt = 0i64;
374+
for &x in &nums1 {
375+
if x > 0 {
376+
let mut left = 0;
377+
let mut right = n;
378+
while left < right {
379+
let mid = (left + right) / 2;
380+
if (x as i64) * (nums2[mid] as i64) > p {
381+
right = mid;
382+
} else {
383+
left = mid + 1;
384+
}
385+
}
386+
cnt += left as i64;
387+
} else if x < 0 {
388+
let mut left = 0;
389+
let mut right = n;
390+
while left < right {
391+
let mid = (left + right) / 2;
392+
if (x as i64) * (nums2[mid] as i64) <= p {
393+
right = mid;
394+
} else {
395+
left = mid + 1;
396+
}
397+
}
398+
cnt += (n - left) as i64;
399+
} else if p >= 0 {
400+
cnt += n as i64;
401+
}
402+
}
403+
cnt
404+
};
405+
406+
while l < r {
407+
let mid = l + (r - l) / 2;
408+
if count(mid) >= k {
409+
r = mid;
410+
} else {
411+
l = mid + 1;
412+
}
413+
}
414+
l
415+
}
416+
}
417+
```
418+
360419
<!-- tabs:end -->
361420

362421
<!-- solution:end -->
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
impl Solution {
2+
pub fn kth_smallest_product(nums1: Vec<i32>, nums2: Vec<i32>, k: i64) -> i64 {
3+
let m = nums1.len();
4+
let n = nums2.len();
5+
let a = nums1[0].abs().max(nums1[m - 1].abs()) as i64;
6+
let b = nums2[0].abs().max(nums2[n - 1].abs()) as i64;
7+
let mut l = -a * b;
8+
let mut r = a * b;
9+
10+
let count = |p: i64| -> i64 {
11+
let mut cnt = 0i64;
12+
for &x in &nums1 {
13+
if x > 0 {
14+
let mut left = 0;
15+
let mut right = n;
16+
while left < right {
17+
let mid = (left + right) / 2;
18+
if (x as i64) * (nums2[mid] as i64) > p {
19+
right = mid;
20+
} else {
21+
left = mid + 1;
22+
}
23+
}
24+
cnt += left as i64;
25+
} else if x < 0 {
26+
let mut left = 0;
27+
let mut right = n;
28+
while left < right {
29+
let mid = (left + right) / 2;
30+
if (x as i64) * (nums2[mid] as i64) <= p {
31+
right = mid;
32+
} else {
33+
left = mid + 1;
34+
}
35+
}
36+
cnt += (n - left) as i64;
37+
} else if p >= 0 {
38+
cnt += n as i64;
39+
}
40+
}
41+
cnt
42+
};
43+
44+
while l < r {
45+
let mid = l + (r - l) / 2;
46+
if count(mid) >= k {
47+
r = mid;
48+
} else {
49+
l = mid + 1;
50+
}
51+
}
52+
l
53+
}
54+
}

0 commit comments

Comments
 (0)