leedcode解析—Python3—Median of Two Sorted Arrays—hard

题目:
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)))。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值