leetcode第4题。两个数组的中位数,第一想法就是归并,比较容易。然后就是减少空间复杂度,不用额外数组存归并后的数组。再进一步,就是用二分法来做。二分法要多想想,因为细节太多了,容易出错。
好了,看题看代码。
题:
4. 寻找两个正序数组的中位数
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
代码循序渐进1:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
n1 = len(nums1)
n2 = len(nums2)
mid = (n1 + n2) // 2 # 奇数 return nums[mid]
if (n1+n2)%2 == 0:
even = True # 偶数
else:
even = False
res = []
p1 = 0
p2 = 0
while len(res) <= mid:
if p2>=n2 or (p1<n1 and nums1[p1] < nums2[p2]):
res.append(nums1[p1])
p1 += 1
else:
res.append(nums2[p2])
p2 += 1
if even:
return (res[-1]+res[-2]) / 2
else:
return res[-1]
代码循序渐进2:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
n1 = len(nums1)
n2 = len(nums2)
mid = (n1 + n2) // 2 # 奇数 return nums[mid]
if (n1+n2)%2 == 0:
even = True # 偶数
else:
even = False
p1 = 0
p2 = 0
if p2>=n2 or (p1<n1 and nums1[p1] < nums2[p2]):
cur = nums1[p1]
else:
cur = nums2[p2]
while (p1+p2) <= mid:
temp = cur
if p2>=n2 or (p1<n1 and nums1[p1] < nums2[p2]):
cur = nums1[p1]
p1 += 1
else:
cur = nums2[p2]
p2 += 1
if even:
return (cur+temp) / 2
else:
return cur
代码循序渐进3:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
n1 = len(nums1)
n2 = len(nums2)
left = (n1+n2+1) //2
right = (n1+n2+2) // 2
def dfs(nums1, nums2, k):
l1 = len(nums1)
l2 = len(nums2)
if not nums1:
return nums2[k-1]
if not nums2:
return nums1[k-1]
if k==1:
return min(nums1[0], nums2[0])
i = min(l1,k//2)-1
j = min(l2,k//2)-1
if nums1[i] > nums2[j]:
return dfs(nums1, nums2[j+1:], k-j-1)
else:
return dfs(nums1[i+1:], nums2, k-i-1)
if left == right:
return dfs(nums1, nums2, left)
res1 = dfs(nums1, nums2, left)
res2 = dfs(nums1, nums2, right)
return (res1 + res2) / 2
好了,记得二分法的方法要多看看,细节太多了,要多写写,注意理清逻辑。
好了。