先耍个流氓
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
nums1.extend(nums2)
nums1.sort()
if len(nums1) % 2 == 0:
return sum(nums1[len(nums1)//2 - 1:len(nums1)//2 + 1:]) / 2
else:
return nums1[(len(nums1) - 1)//2]
通过 | 268 ms | 14 MB | Python3 |
执行用时 :268 ms, 在所有 Python3 提交中击败了5.67%的用户
内存消耗 :14 MB, 在所有 Python3 提交中击败了5.28%的用户
*Binary Search
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
if len(nums1) <len(nums2):
list1 = nums2
list2 = nums1
else:
list1 = nums1
list2 = nums2
len1 = len(list1)
len2 = len(list2)
totalLen = len1+len2
start = 0
end = len1
while start<=end :
if len1 == 0 or len2 == 0:
nums1.extend(nums2)
nums1.sort()
if len(nums1) % 2 == 0:
median = sum(nums1[len(nums1) // 2 - 1:len(nums1) // 2 + 1:]) / 2
else:
median = nums1[(len(nums1) - 1) // 2]
break
#Binary Search
partition1 = (start+end)//2
partition2 = (len1+len2+1)//2-partition1
leftList1 = list1[:partition1]
leftList2 = list2[:partition2]
rightLit1 = list1[partition1:]
rightLit2 = list2[partition2:]
adjustInf = 0
if not len(leftList1):
leftList1 = [float('-inf')]
adjustInf += -1
if not len(leftList2):
leftList2 = [float('-inf')]
adjustInf += -1
if not len(rightLit1):
rightLit1 = [float('inf')]
adjustInf += 1
if not len(rightLit2):
rightLit2 = [float('inf')]
adjustInf += 1
maxLeftList1 = leftList1[-1]
maxLeftList2 = leftList2[-1]
minRightList1 = rightLit1[0]
minRightList2 = rightLit2[0]
#print(maxLeftList1, maxLeftList2, minRightList1, minRightList2)
leftRightNumberDifference = len(leftList1) + len(leftList2) - len(rightLit1) - len(rightLit2) + adjustInf
#print(leftRightNumberDifference)
if maxLeftList1 <= minRightList2 and maxLeftList2 <= minRightList1 and abs(leftRightNumberDifference)<=1:
if totalLen%2==0:
median = (max(maxLeftList1,maxLeftList2) + min(minRightList1, minRightList2))/2
else:
if leftRightNumberDifference>0:
median = max(maxLeftList1,maxLeftList2)
else:
median = min(minRightList1, minRightList2)
break
elif maxLeftList1 > minRightList2 or leftRightNumberDifference > 1:#分割点大了 向左移变小
end = partition1-1
elif minRightList1 < maxLeftList2 or leftRightNumberDifference < 1: #分割点小了 向右移变大
start = partition1+1
return median
通过 | 120 ms | 14 MB | Python3 |
执行用时 :120 ms, 在所有 Python3 提交中击败了77.08%的用户
内存消耗 :14 MB, 在所有 Python3 提交中击败了5.28%的用户
Ref