Skip to content

Commit ba78055

Browse files
authored
Merge pull request neetcode-gh#2543 from kousukekikuchi1984/feature/median-of-two-sorted-arrays-rust
Create 0004-median-of-two-sorted-arrays.rs
2 parents 4dc4303 + b4066e6 commit ba78055

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
impl Solution {
2+
pub fn find_median_sorted_arrays(mut nums1: Vec<i32>, mut nums2: Vec<i32>) -> f64 {
3+
let total = nums1.len() + nums2.len();
4+
let half = total / 2;
5+
6+
if nums1.len() > nums2.len() {
7+
std::mem::swap(&mut nums1, &mut nums2);
8+
}
9+
10+
let mut left = 0;
11+
let mut right = nums1.len();
12+
13+
while left <= right {
14+
let mid = left + (right - left) / 2;
15+
let pointer = half - mid;
16+
17+
let base_left = if mid > 0 {
18+
nums1[mid - 1] as f64
19+
} else {
20+
f64::MIN
21+
};
22+
23+
let base_right = if mid < nums1.len() {
24+
nums1[mid] as f64
25+
} else {
26+
f64::MAX
27+
};
28+
29+
let ref_left = if pointer > 0 {
30+
nums2[pointer - 1] as f64
31+
} else {
32+
f64::MIN
33+
};
34+
35+
let ref_right = if pointer < nums2.len() {
36+
nums2[pointer] as f64
37+
} else {
38+
f64::MAX
39+
};
40+
41+
if base_left <= ref_right && ref_left <= base_right {
42+
if total % 2 == 1 {
43+
return base_right.min(ref_right);
44+
} else {
45+
return (base_left.max(ref_left) + base_right.min(ref_right)) / 2.0;
46+
}
47+
} else if base_left > ref_right {
48+
right = mid - 1;
49+
} else {
50+
left = mid + 1;
51+
}
52+
}
53+
54+
panic!("Arrays are not sorted");
55+
}
56+
}

0 commit comments

Comments
 (0)