Skip to content

4. 寻找两个正序数组的中位数

LeetCode题目链接:寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n))

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106

实战

rust
// 拼接两个Vec
fn concat_vecs(arr1: Vec<i32>, arr2: Vec<i32>) -> Vec<i32> {
    let mut arr1 = arr1;
    let mut arr2 = arr2;
    arr1.append(&mut arr2);
    arr1
}

// 快速排序
// 分区
fn partition(arr: &mut [i32]) -> usize {
    let pivot = arr[arr.len() - 1]; // 选择最后一个数作为基准
    let mut i = 0;

    for j in 0..arr.len() - 1 {
        if arr[j] < pivot {
            arr.swap(i, j); // 小于基准的数和arr[i]交换
            i += 1;
        }
    }

    arr.swap(i, arr.len() - 1); // 交换基准数与arr[i]
    i  // 返回基准的下标
}

// 排序
fn quick_sort(arr: &mut[i32]) -> () {
    if arr.len() <= 1 {
        return;
    }

    let pivot = partition(arr);
    quick_sort(&mut arr[0..pivot]);
    quick_sort(&mut arr[pivot + 1..]);
}

// 寻找中位数
pub fn find_median_sorted_arrays(arr1: Vec<i32>, arr2: Vec<i32>) -> f64 {
    let mut concated_arr = concat_vecs(arr1, arr2);
    quick_sort(&mut concated_arr);
    let median_num: f64;
    if concated_arr.len() % 2 == 0 {
        let medium_index = concated_arr.len() / 2;
        median_num = (concated_arr[medium_index - 1] + concated_arr[medium_index]) as f64 / 2.0 as f64;
    } else {
        let medium_index: f64 = (concated_arr.len() / 2) as f64;
        let floor_index: usize = medium_index.floor() as usize;
        median_num = concated_arr[floor_index].into();
    }
    median_num
}

测试

输入两个数组:

数组1: 数组2:

结果:

文档由 Vincent-the-gamer 提供 | 使用 MIT 许可证开源