【算法训练】LeetCode#4 寻找两个正序数组的中位数
一、描述
给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n))
。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
二、思路
不考虑时间复杂度的前提下,可以直接将两个数组合到一起再找到中位数,当然了,既然题中给了时间复杂度,那就是不希望这么做。
先计算出两个数组的长度,然后就知道了中位数出现在第几位,然后再逐位合并数组,当合并到目标位时就可以计算中位数了。
哦,其实不需要真做合并操作,找到目标位即可。
三、解题
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
# 获得长度
m = len(nums1)
n = len(nums2)
# 判断是否需要求平均
if (m+n)%2 == 0:
flag = True
middleLoc = (m+n)/2
else:
flag = False
middleLoc = int((m+n)/2)+1
loc1,loc2 = -1,-1
sumLoc = 0
judWho = 0 # 根据这个判断哪一位是新的
returnNum = 0
while True:
# 任意一个数组没有合并完成时
if loc1 != m-1 and loc2 != n-1:
if nums1[loc1+1] < nums2[loc2+1]:
loc1 += 1
judWho = 1
else:
loc2 += 1
judWho = 2
else:
# 逻辑上有一个数组合并完成了
if loc1 == m-1:
loc2 += 1
judWho = 2
else:
loc1+= 1
judWho = 1
sumLoc += 1
if flag == True and sumLoc == middleLoc:
returnNum += (nums1[loc1] if judWho == 1 else nums2[loc2])
if flag == True and sumLoc == middleLoc+1:
returnNum += (nums1[loc1] if judWho == 1 else nums2[loc2])
break
if flag == False and sumLoc == middleLoc:
returnNum += (nums1[loc1] if judWho == 1 else nums2[loc2])
break
return returnNum/2 if flag else returnNum