1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| fn kth(nums1: &[i32], nums2: &[i32], mut k: usize) -> i32 { let mut i = 0usize; let mut j = 0usize;
loop { if i == nums1.len() { return nums2[j + k - 1]; } if j == nums2.len() { return nums1[i + k - 1]; } if k == 1 { return nums1[i].min(nums2[j]); }
let half = k / 2; let ni = (i + half).min(nums1.len()) - 1; let nj = (j + half).min(nums2.len()) - 1;
if nums1[ni] <= nums2[nj] { k -= ni - i + 1; i = ni + 1; } else { k -= nj - j + 1; j = nj + 1; } } }
pub fn find_median_sorted_arrays(nums1: Vec<i32>, nums2: Vec<i32>) -> f64 { let total = nums1.len() + nums2.len();
if total % 2 == 1 { kth(&nums1, &nums2, total / 2 + 1) as f64 } else { let left = kth(&nums1, &nums2, total / 2) as f64; let right = kth(&nums1, &nums2, total / 2 + 1) as f64; (left + right) / 2.0 } }
|