一个好题目:
两个有序数组,输出这两个有序数组合并后的中位数,要求复杂度为O(log (m+n)).
https://zhuanlan.zhihu.com/p/39129143
很经典的讲解,将问题最后解析为数学问题,控制变量法为单变量,就不那么复杂了。学到了,这个题目在很多领域都有应用,特别是在大数据情况下的,分治的思想
todo:自己的理解
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
m = len(nums1)
n = len(nums2)
if m>n:
nums1,nums2,m,n = nums2,nums1,n,m
if n == 0:
return None
imin = 0
imax = m
half_len = (m + n + 1)//2
while imin <= imax:
i = (imin + imax) // 2
j = half_len - i
# 三种情况
if i>0 and nums1[i-1]>nums2[j]:
# i 太大了
imax = i - 1
elif i<m and nums1[i]<nums2[j-1]:
# i 太小了
imin = i + 1
else:
# 找到了,先算左边
if i == 0:
# 数组nums1整个大于nums2
max_left = nums2[j-1]
elif j == 0:
# 数组nums2整个大约num1
max_left = nums1[i-1]
else:
max_left = max(nums1[i-1],nums2[j-1])
# 奇数,左边比右边大一个
if (m + n) % 2 == 1:
return max_left
if i == m:
# nums1 整个小于 num2
min_right = nums2[j]
elif j == n:
# nums2 整个大约nums1
min_right = nums1[i]
else:
# 正常情况
min_right = min(nums1[i],nums2[j])
# 偶数
return (max_left + min_right)/2.0