leetcode --4.寻找两个正序数组的中位数 python

leecode - 4.寻找两正序数组的中位数

leetcode --4.寻找两个正序数组的中位数 python_第1张图片
方法一:双指针
使用两个指针p1, p2分别指向nums1和nums2,进行比较,如果nums1[p1] < nums2[p2], 则p1+=1,相反则p2 += 1

方法二:第K小个数
将找中位数问题转化为寻找第K小个数的问题
k = (len(nums1)+len(nums2)) // 2

每次剔除一个数组里面较小的 k // 2 个数

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        length = len(nums1) + len(nums2)
        if len(nums1) < len(nums2): # 长序列的放在前面,防止越界
            nums1, nums2 = nums2, nums1
        
        if length == 2:
            if len(nums2) == 0: # 中位数在nums1
                return (nums1[0] + nums1[1]) / 2.0
            return (nums1[0] + nums2[0]) / 2.0  # nums1和nums2各有一个元素

        if length % 2 == 0: # 偶数个元素
            EorO = True
            k = length // 2
        else:   # 奇数个元素
            EorO = False
            k = length // 2 + 1

        def helper(nums1, nums2, k):
        
           # if len(nums1) < len(nums2) or (len(nums1) == len(nums2) and nums1[0] > nums2[0]:
           # 不明白此处为什么在长度相同的时候,要保证nums1[0]比较小
           # 将(len(nums1) == len(nums2) and nums1[0] > nums2[0]删除程序依然可以通过
           if len(nums1) < len(nums2):   
                nums1, nums2 = nums2, nums1
            if len(nums2) == 0: # 递归结束条件之一
                if EorO == True:
                    return (nums1[k-1] + nums1[k]) / 2.0
                else:
                    return nums1[k-1]

            if k == 1:  # 递归结束条件二
                if EorO == True:
                    num = min(nums1[0], nums2[0])   # 取出最小的元素
                    if num == nums1[0]:
                        return (num + min(nums1[1], nums2[0])) / 2.0
                    else:
                        if len(nums2) > 1:  # nums2中的元素不止一个
                            return (num + min(nums1[0], nums2[1])) / 2.0
                        else:
                            return (num + nums1[0]) / 2.0        
                else:
                    return min(nums1[0], nums2[0])
            t = min(k//2, len(nums2))   # 防止溢出
            if nums1[t-1] >= nums2[t-1]:    # 剔除nums2中的数
                return helper(nums1, nums2[t:], k-t)
            else:   # 剔除nums1中的数
                return helper(nums1[t:], nums2, k-t)
        return helper(nums1, nums2, k)                    
       

你可能感兴趣的:(刷题,leetcode,算法,python)