问题主要是时间复杂度要log(m+n),但先不考虑这个,看到两有序数组,用归并排序是第一直觉,然后直接按照奇数取中间,偶数去两边和的一半。但是时间复杂度不符合要求。
class Solution:
def merger(nums1:List[int], nums2:List[int]) -> List[int]:
nums3 = []
i = 0
j = 0
while i<len(nums1) and j<len(nums2):
if nums1[i] < nums2[j]:
nums3.append(nums1[i])
i +=1
else:
nums3.append(nums2[j])
j +=1
if i == len(nums1):
while j<len(nums2):
nums3.append(nums2[j])
j +=1
else:
while i<len(nums1):
nums3.append(nums1[i])
i +=1
return nums3
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
nums3 = Solution.merger(nums1, nums2)
print(nums3)
lenn = len(nums1) + len(nums2)
if lenn%2 == 0:
return (nums3[lenn//2] + nums3[lenn//2 - 1])/2
else:
return nums3[lenn//2]
参考链接有:【第 k 小数解法】你懂了吗?
官方:寻找两个有序数组的中位数
减低时间复杂度到log,一般就是二分法。
思路差不多捋了下,明天手写下代码试试
代码参照官方的,思路看的第一个链接【第 k 小数】
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
def getKthElement(k):
"""
- 主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 进行比较
- 这里的 "/" 表示整除
- nums1 中小于等于 pivot1 的元素有 nums1[0 .. k/2-2] 共计 k/2-1 个
- nums2 中小于等于 pivot2 的元素有 nums2[0 .. k/2-2] 共计 k/2-1 个
- 取 pivot = min(pivot1, pivot2),两个数组中小于等于 pivot 的元素共计不会超过 (k/2-1) + (k/2-1) <= k-2 个
- 这样 pivot 本身最大也只能是第 k-1 小的元素
- 如果 pivot = pivot1,那么 nums1[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums1 数组
- 如果 pivot = pivot2,那么 nums2[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums2 数组
- 由于我们 "删除" 了一些元素(这些元素都比第 k 小的元素要小),因此需要修改 k 的值,减去删除的数的个数
"""
index1, index2 = 0, 0
while True:
# 特殊情况
if index1 == m:
return nums2[index2 + k - 1]
if index2 == n:
return nums1[index1 + k - 1]
if k == 1:
return min(nums1[index1], nums2[index2])
# 正常情况
newIndex1 = min(index1 + k // 2 - 1, m - 1)
newIndex2 = min(index2 + k // 2 - 1, n - 1)
pivot1, pivot2 = nums1[newIndex1], nums2[newIndex2]
if pivot1 <= pivot2:
k -= newIndex1 - index1 + 1
index1 = newIndex1 + 1
else:
k -= newIndex2 - index2 + 1
index2 = newIndex2 + 1
m, n = len(nums1), len(nums2)
totalLength = m + n
if totalLength % 2 == 1:
return getKthElement((totalLength + 1) // 2)
else:
return (getKthElement(totalLength // 2) + getKthElement(totalLength // 2 + 1)) / 2
似乎在样例中,并没有体现出时间复杂度的减少?