首先介绍一下简单的合并有序列表的方法:
nums1=[1,2]
nums2=[3,4]
self=[]
def findMedianSortedArrays(self, nums1, nums2 ) -> float:
i = len(nums1)
j = len(nums2)
p = i if i < j else j
n = i + j
arr = [0 for x in range(0, n)]
m = h = q = 0
while (h < i) & (q < j):
if nums1[h] > nums2[q]:
arr[m] = nums2[q]
m = m + 1
q = q + 1
else:
arr[m] = nums1[h]
m = m + 1
h = h + 1
if h < i:
for t in range(h, i):
arr[m] = nums1[t]
m = m + 1
if q < j:
for r in range(q,j):
arr[m] = nums2[r]
m = m + 1
l =len(arr)
if l%2!=0:
return arr[int(l/2)+1]
else:
return (arr[int(l/2)]+arr[int(l/2)-1])/2
print(findMedianSortedArrays(self,nums1,nums2))
结果:
二分改进:(这里的二分是对排列顺序个数的二分,而不是对大小进行二分
import sys
sys.setrecursionlimit(10000)
nums1=[1,2]
nums2=[3,4]
self=[]
def getmax(nums1,start1,nums2,start2,k) -> float:
if(start1>len(nums1)-1):
return nums2[start2+k-1]
if(start2>len(nums2)-1):
return nums1[start1+k-1]
if(k==1):
return nums1[start1] if nums1[start1]<nums2[start2] else nums2[start2]
nums1mid = nums1[start1+int(k/2)-1] if (start1+int(k/2)-1<len(nums1)) else float('inf')
nums2mid = nums2[start2 + int(k / 2) - 1] if (start2 + int(k / 2) - 1 < len(nums2)) else float('inf')
if(nums1mid<nums2mid):
return (getmax(nums1,start1+int(k/2),nums2,start2,k-int(k/2)))
else:
return (getmax(nums1,start1,nums2,start2+int(k/2),k-int(k/2)))
def findMedianSortedArrays(self, nums1, nums2 ) -> float:
m = len(nums1)
n = len(nums2)
l = (m+n+1)/2
r = (m+n+2)/2
return (getmax(nums1,0,nums2,0,l))+getmax(nums1,0,nums2,0,r)/2.0
# def findMedianSortedArrays(self, nums1, nums2 ) -> float:
#
# i = len(nums1)
# j = len(nums2)
# p = i if i < j else j
# n = i + j
# arr = [0 for x in range(0, n)]
# m = h = q = 0
# while (h < i) & (q < j):
# if nums1[h] > nums2[q]:
# arr[m] = nums2[q]
# m = m + 1
# q = q + 1
# else:
# arr[m] = nums1[h]
# m = m + 1
# h = h + 1
# if h < i:
# for t in range(h, i):
# arr[m] = nums1[t]
# m = m + 1
# if q < j:
# for r in range(q,j):
# arr[m] = nums2[r]
# m = m + 1
# l =len(arr)
# if l%2!=0:
# return arr[int(l/2)+1]
# else:
# return (arr[int(l/2)]+arr[int(l/2)-1])/2
print(findMedianSortedArrays(self,nums1,nums2))