返回
双指针夹击!化繁为简,解读 LeetCode HOT100 之寻找两个正序数组的中位数
IOS
2023-09-24 14:14:00
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精选题目中探索算法的魅力。快来一起开启算法的学习之旅吧!