题目:
Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.
我的思路:
利用numpy工具包将两个列表定义为数组,再将数组合并,排序,即可找到中间值,Runtime: 156 ms(约1%);Memory Usage: 31.4 MB(约1%),该方法效率较低
我的解答:
import numpy as np
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
a = np.asarray(nums1)
b = np.asarray(nums2)
c = np.concatenate((a, b))
d = np.sort(c)
if len(d) == 1:
return d[0]
elif len(d)%2 == 1:
return d[int((len(d)-1)/2)]
elif len(d)%2 == 0:
return (d[int(len(d)/2)] + d[int(len(d)/2 - 1)])/2
答案:
这道题乍一看非常简单,但是运行速度最快的最优解很难想到,这里官方给的解释非常复杂,我承认我看了一个多小时都没明白他在说什么,这里稍微解释一下我的理解【核心思想:二分法】,由于时间关系,我没有进行代码实现,先留个坑。
这里最重要的是题目给出的是两个已经排好序的数组,这里假设小的为n,大的为m,我们可以采用二分法的思想,先找到n,m的中位数n_mid,m_mid,比较这两个中位数,这里我们先假设m_mid更大,我们就可以确定,合并m n两个数组的中位数绝对不可能出现在较小中位数数列n的左边一半(mid比他们都大),也不可能出现在较大中位数数列m的右边一半(mid比他们都小),所以我们可删除小数列n的左边一半,删除m的右边和n删掉的数目相同的一段,(等于整个合并数组的mid左右两边各删掉n/2),反之同理。删减后的n m 可以继续分别取中位数再比较,再删减,循环直到n只剩下一个数,此时直接可得到整个数组的中位数,复杂度为O(log(min(m,n)))。