力扣刷题 4. 寻找两个正序数组的中位数
两种方法都能通过,但是排序的复杂度肯定不满足题目要求的。第二种我不知道是不是满足了复杂度要求,代码有点多,不过也还容易能看懂喽
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
# reslist = nums1
# reslist.extend(nums2) #合并数组,extend()函数无返回值,谨记
# reslist.sort() #排序
# n=len(reslist)
# if n%2==0: #找中位数
# return (reslist[n//2-1]+reslist[n//2])/2
# else:
# return reslist[n//2]
#这个复杂度有点高,不满足O(log(m+n))
m,n=len(nums1),len(nums2)
i, j = 0, 0
cout = -1
if (m+n)%2==0: #合并后的长度是偶数
left_index = (m+n)//2-1 #确认左右的下标是多少
right_index = (m+n)//2
while cout<=right_index: #直到找到右下标这么多
if i<m and j<n: #两个数组都还有数那就要做一点比较,小的往后移,同时判断个数有没有到左下标和右下标,做记录
if nums1[i]>nums2[j]:
cout +=1
if cout==left_index: #如果已经找到了左下标,那要记录一下
left=nums2[j]
if cout==right_index: #如果已经找到了右下标,那可以配合左下标返回了
right=nums2[j]
return (left+right)/2
j +=1
else:
cout +=1
if cout==left_index:
left=nums1[i]
if cout==right_index:
right=nums1[i]
return (left+right)/2
i +=1
elif j<n: #只有nums2有数字了
cout +=1
if cout==left_index:
left=nums2[j]
if cout==right_index:
right=nums2[j]
return (left+right)/2
j +=1
else: #只有nums1有数字了
cout +=1
if cout==left_index:
left=nums1[i]
if cout==right_index:
right=nums1[i]
return (left+right)/2
i +=1
else: #合并后的长度是奇数
mid=(m+n)//2 #确认中位数下标
while cout<=mid:
if i<m and j<n:
if nums1[i]>nums2[j]:
cout +=1
if cout==mid:
return nums2[j]
j +=1
else:
cout +=1
if cout==mid:
return nums1[i]
i +=1
elif j<n:
cout +=1
if cout==mid:
return nums2[j]
j +=1
else:
cout +=1
if cout==mid:
return nums1[i]
i +=1