返回

双指针夹击!化繁为简,解读 LeetCode HOT100 之寻找两个正序数组的中位数

IOS

LeetCode HOT100 之寻找两个正序数组的中位数:代码实现与解析

在LeetCode HOT100系列文章的第4篇,让我们共同探索「寻找两个正序数组的中位数」。这道题目看似复杂,但背后的算法却非常巧妙。

题目
给定两个正序数组 nums1 和 nums2,分别包含 m 和 n 个元素。请你找出这两个数组的中位数。

示例 1:

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

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

算法解析:
双指针法是一种非常巧妙的算法,它能够将复杂的问题分解为一系列简单的问题。在「寻找两个正序数组的中位数」这道题中,我们可以将两个数组看作两个有序链表。然后,我们使用两个指针(分别指向两个数组的头部)来遍历这两个链表。当两个指针同时到达链表的末尾时,我们就可以得到这两个数组的合并结果。

为了计算合并结果的中位数,我们需要知道合并结果的长度。如果合并结果的长度为奇数,那么中位数就是合并结果的中间元素。如果合并结果的长度为偶数,那么中位数就是合并结果的中间两个元素的平均值。

具体实现:
在Python中,我们可以使用两个指针来遍历两个数组,并将合并结果存储在一个新的数组中。然后,我们就可以根据合并结果的长度来计算中位数。

def find_median_sorted_arrays(nums1, nums2):
  """
  找到两个正序数组的中位数

  参数:
    nums1 (list): 第一个正序数组
    nums2 (list): 第二个正序数组

  返回:
    float: 两个数组合并后的中位数
  """

  # 合并两个数组
  merged_nums = []
  p1 = 0
  p2 = 0
  while p1 < len(nums1) and p2 < len(nums2):
    if nums1[p1] < nums2[p2]:
      merged_nums.append(nums1[p1])
      p1 += 1
    else:
      merged_nums.append(nums2[p2])
      p2 += 1

  # 将剩余元素添加到合并后的数组
  while p1 < len(nums1):
    merged_nums.append(nums1[p1])
    p1 += 1
  while p2 < len(nums2):
    merged_nums.append(nums2[p2])
    p2 += 1

  # 计算合并后的数组的中位数
  mid = len(merged_nums) // 2
  if len(merged_nums) % 2 == 0:
    return (merged_nums[mid] + merged_nums[mid - 1]) / 2
  else:
    return merged_nums[mid]


# 测试代码
nums1 = [1, 3]
nums2 = [2]
print(find_median_sorted_arrays(nums1, nums2))  # 2.00000

nums1 = [1, 2]
nums2 = [3, 4]
print(find_median_sorted_arrays(nums1, nums2))  # 2.50000

结语:

LeetCode HOT100系列文章旨在帮助你轻松理解算法的奥秘,我们将在LeetCode HOT100精选题目中探索算法的魅力。快来一起开启算法的学习之旅吧!