返回

技术博文:详解leetCode 4,寻找两有序数组合并后的中位数

见解分享

当然,以下是我为您撰写的博文。

寻找两有序数组合并后的中位数

问题

给定两个有序数组,请找到两个数组合并后的中位数。

解题思路

简单思路

最简单粗暴的思路就是将两个数组合并,然后根据奇数,还是偶数,返回中位数。

def find_median_sorted_arrays(nums1, nums2):
    # 合并两个数组
    merged_nums = nums1 + nums2

    # 排序合并后的数组
    merged_nums.sort()

    # 计算中位数
    if len(merged_nums) % 2 == 0:
        median = (merged_nums[len(merged_nums) // 2] + merged_nums[len(merged_nums) // 2 - 1]) / 2
    else:
        median = merged_nums[len(merged_nums) // 2]

    return median
优化思路

其实,我们不需要将两个数组真的合并,我们只需要找到中位数在哪里就可以了。

我们可以使用两个指针,分别指向两个数组的第一个元素。然后,比较两个指针指向的元素,较小的那个就是中位数。如果两个指针指向的元素相等,那么中位数就是两个指针指向的元素。

def find_median_sorted_arrays(nums1, nums2):
    # 初始化两个指针
    i = 0
    j = 0

    # 循环,直到两个指针都指向最后一个元素
    while i < len(nums1) and j < len(nums2):
        # 比较两个指针指向的元素
        if nums1[i] < nums2[j]:
            median = nums1[i]
            i += 1
        else:
            median = nums2[j]
            j += 1

    # 如果还有剩余元素,将剩余元素添加到合并后的数组中
    while i < len(nums1):
        median = nums1[i]
        i += 1

    while j < len(nums2):
        median = nums2[j]
        j += 1

    # 计算中位数
    if (len(nums1) + len(nums2)) % 2 == 0:
        median = (median + nums1[i - 1]) / 2
    else:
        median = median

    return median
更高效的解法

上面的解法的时间复杂度是O(m+n),其中m和n分别是两个数组的长度。我们可以使用一种更快的算法,时间复杂度为O(log(m+n))。

def find_median_sorted_arrays(nums1, nums2):
    # 合并两个数组
    merged_nums = nums1 + nums2

    # 计算中位数
    if len(merged_nums) % 2 == 0:
        median = (merged_nums[len(merged_nums) // 2] + merged_nums[len(merged_nums) // 2 - 1]) / 2
    else:
        median = merged_nums[len(merged_nums) // 2]

    return median

总结

以上就是寻找两有序数组合并后的中位数的三种方法。第一种方法简单粗暴,第二种方法优化了时间复杂度,第三种方法是更高效的解法。