LeetCode【Python3】-p4. Median of Two Sorted Arrays

先耍个流氓

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        nums1.extend(nums2)
        nums1.sort()
        if len(nums1) % 2 == 0:
            return sum(nums1[len(nums1)//2 - 1:len(nums1)//2 + 1:]) / 2
        else:
            return nums1[(len(nums1) - 1)//2]        
通过268 ms14 MBPython3

 

执行用时 :268 ms, 在所有 Python3 提交中击败了5.67%的用户

内存消耗 :14 MB, 在所有 Python3 提交中击败了5.28%的用户


*Binary Search

 

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        if len(nums1) <len(nums2):
            list1 = nums2
            list2 = nums1
        else:                
            list1 = nums1
            list2 = nums2
        len1 = len(list1)
        len2 = len(list2)
        totalLen = len1+len2

        start = 0
        end = len1

        while start<=end :
            if len1 == 0 or len2 == 0:
                nums1.extend(nums2)
                nums1.sort()
                if len(nums1) % 2 == 0:
                    median = sum(nums1[len(nums1) // 2 - 1:len(nums1) // 2 + 1:]) / 2
                else:
                    median = nums1[(len(nums1) - 1) // 2]
                break
            
            #Binary Search
            partition1 = (start+end)//2 
            partition2 = (len1+len2+1)//2-partition1

            leftList1 = list1[:partition1]
            leftList2 = list2[:partition2]
            rightLit1 = list1[partition1:]
            rightLit2 = list2[partition2:]

            adjustInf = 0
            if not len(leftList1):
                leftList1 = [float('-inf')]
                adjustInf += -1
            if not len(leftList2):
                leftList2 = [float('-inf')]
                adjustInf += -1
            if not len(rightLit1):
                rightLit1 = [float('inf')]
                adjustInf += 1
            if not len(rightLit2):
                rightLit2 = [float('inf')]
                adjustInf += 1

            maxLeftList1 = leftList1[-1]
            maxLeftList2 = leftList2[-1]
            minRightList1 = rightLit1[0]
            minRightList2 = rightLit2[0]
            #print(maxLeftList1, maxLeftList2, minRightList1, minRightList2)
            leftRightNumberDifference = len(leftList1) + len(leftList2) - len(rightLit1) - len(rightLit2) + adjustInf
            #print(leftRightNumberDifference)
            if maxLeftList1 <= minRightList2 and maxLeftList2 <= minRightList1  and abs(leftRightNumberDifference)<=1:
                if totalLen%2==0:
                    median = (max(maxLeftList1,maxLeftList2) + min(minRightList1, minRightList2))/2
                else:
                    if leftRightNumberDifference>0:
                        median = max(maxLeftList1,maxLeftList2)
                    else:
                        median = min(minRightList1, minRightList2)
                break
            elif maxLeftList1 > minRightList2 or leftRightNumberDifference > 1:#分割点大了 向左移变小
                end = partition1-1
            elif minRightList1 < maxLeftList2 or leftRightNumberDifference < 1: #分割点小了 向右移变大
                start = partition1+1
        return median
通过120 ms14 MBPython3

执行用时 :120 ms, 在所有 Python3 提交中击败了77.08%的用户

内存消耗 :14 MB, 在所有 Python3 提交中击败了5.28%的用户

 

Ref

[1] https://www.youtube.com/watch?v=LPFhl65R7ww

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值