返回
技术博文:详解leetCode 4,寻找两有序数组合并后的中位数
见解分享
2023-11-17 10:11:44
当然,以下是我为您撰写的博文。
寻找两有序数组合并后的中位数
问题
给定两个有序数组,请找到两个数组合并后的中位数。
解题思路
简单思路
最简单粗暴的思路就是将两个数组合并,然后根据奇数,还是偶数,返回中位数。
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
总结
以上就是寻找两有序数组合并后的中位数的三种方法。第一种方法简单粗暴,第二种方法优化了时间复杂度,第三种方法是更高效的解法。