【Leetcode】Python实现两个排序数组的中位数

当两个数组合并后的总元素长度是奇数时,中位数的下标是n/2。
当两个数组合并后的总元素个数是偶数时,中位数是下标n/2-1和下标n/2两个元素的平均值。
所以不论总长度的奇偶性,可以将n/2作为右中位数,n/2-1作为左中位数,当总长度是奇数时,不使用左中位数。但是必须要找到第n/2+1个元素。

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        # 判断传入数组是否为空
        if nums1 is None or nums2 is None:
            return
        # 求出数组nums1、nums2的长度
        nums1_length = len(nums1)
        nums2_length = len(nums2)
        # 求出两个数组的总长度
        total_length = nums1_length + nums2_length
        # 判断是否小于0
        if total_length == 0:
            return
        # 如果数组nums2传入为空,则重新调用查询中位数,调换参数位置,数组nums1的位置是允许为空的
        if nums2_length == 0:
            return self.findMedianSortedArrays(nums2, nums1)

        left = -1
        right = -1
        nums1_Start = 0
        nums2_Start = 0
        # 循环遍历总长度一半,+1是因为range取不到总长度一半
        for i in range(int(total_length/2)+1):
            # left记录上一次循环的right值
            left = right
            # 如果nums1的记录点小于nums1的长度  并  (nums2的记录点大于等于nums2的长度  或  nums1的记录点的值 小于 nums2记录点的值)
            if nums1_Start < nums1_length and (nums2_Start >= nums2_length or nums1[nums1_Start] < nums2[nums2_Start]):
                # 给right赋值  nums1的记录点的值,然后让nums1记录点加1
                right = nums1[nums1_Start]
                nums1_Start += 1
            else:
                # 给right赋值  nums2的记录点的值,然后让nums2记录点加1
                right = nums2[nums2_Start]
                nums2_Start += 1

        # 如果总长度 & 1 为 0 ,则使用两个数除2,即判断total_length是否为偶数
        # 也可使用total_length % 2 == 0这种判断,但是使用&号性能稍高一点
        if (total_length & 1) == 0:
            return (left+right)/2.0
        else:
            # 使用除于1.0是为了让结果为浮点数
            return right/1.0


if __name__ == '__main__':
    # nums1 = [1, 3]
    # nums2 = [2]

    nums1 = [1, 2]
    nums2 = [3, 4]
    s = Solution()
    median_num = s.findMedianSortedArrays(nums1, nums2)
    print(median_num)

你可能感兴趣的:(Python,Leetcode)