【力扣】4. 寻找两个正序数组的中位数(折半删除法)

【力扣】4. 寻找两个正序数组的中位数

题目:
给定两个大小为mn的正序(从小到大)数组 nums1nums2
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))
你可以假设 nums1nums2 不会同时为空。

简单思路:(复杂度不满足要求)

将这两个数组重排成为一个大数组,取中间的那个数即可。这种时间复杂度为O(m+n)
代码:

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        total_len = len(nums1) + len(nums2)
        mid_idx = total_len // 2
        tem = []
        while nums1 and nums2:
            if nums1[0] <= nums2[0]:
                tem.append(nums1.pop(0))
            else:
                tem.append(nums2.pop(0))
        
        if not nums1 or not nums2:
            tem += nums1 if nums1 else nums2
        
        if total_len % 2 == 0:   #偶数
            return (tem[mid_idx]+tem[mid_idx-1])/2
        else:
            return float(tem[mid_idx])

进阶思路:
模拟出栈的方式,每次弹出两个数组中较小的数组,这样的话时间复杂度为O((m+n)/2)
代码:

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        counter = 0
        total_len = len(nums1)+len(nums2)
        if total_len % 2 == 0:
            mid = total_len//2
        else:
            mid = total_len//2 + 1
        #res = []
        if len(nums1) != len(nums2):
            tem = [float('inf') for _ in range(abs(len(nums1) - len(nums2)))]
            if len(nums1) < len(nums2):
                nums1 += tem
            else:
                nums2 += tem



        while nums1 and nums2 and counter < mid:
            if nums1[0] <= nums2[0]:
                a = nums1.pop(0)
                counter += 1
            else:
                a = nums2.pop(0)
                counter += 1

        if total_len % 2 == 0:
            if not nums1:
                return (a+nums2[0]) / 2
            elif not nums2:
                return (a+nums1[0]) / 2
            return (a+min(nums1[0], nums2[0]))/2
        else:
            return float(a)

终极思路:
折半删除法。将寻找中位数等同于寻找第k小的数,每次都删除 k // 2个数字,具体证明见力扣大神整理
代码还没写出来。。。。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值