1. 程式人生 > >4. Median of Two Sorted Arrays(兩個有序陣列的中位數)

4. Median of Two Sorted Arrays(兩個有序陣列的中位數)

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

Example 1:
nums1 = [1, 3]
nums2 = [2]

The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

非正確答案,求的不是嚴格中位數,當兩個陣列元素個數總和為偶數時,求的是中間兩個數左邊的數:

class Solution:
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        return self.findMedian_logn(nums1, len(nums1), nums2, len(nums2))

    def
findMedian_logn(self, nums1, n1, nums2, n2):
m1 = (n1-1)//2 m2 = (n2-1)//2 if n1==1: if n2 ==1: return nums1[0] if nums1[0]<nums2[0] else nums2[0] if n2%2==0: if nums1[0] >= nums2[m2+1]: return nums2[m2+1
] elif nums1[0] <= nums2[m2]: return nums2[m2] else: return nums1[0] else: if nums1[0] >=nums2[m2]: return nums2[m2] elif nums1[0] <= nums2[m2-1]: return nums2[m2-1] else: return nums1[0] elif n2==1: if n1%2==0: if nums2[0] >= nums1[m1+1]: return nums1[m1+1] elif nums2[0] <= nums1[m1]: return nums1[m1] else: return nums2[0] else: if nums2[0] >= nums1[m1]: return nums2[m2] elif nums2[0] <= nums1[m1-1]: return nums1[m1-1] else: return nums2[0] else: cutlen = n1/2 if n1/2 < n2/2 else n2/2 if nums1[m1] == nums2[m2]: return nums1[m1] elif nums1[m1] < nums2[m2]: return self.findMedian_logn(nums1[cutlen:], n1-cutlen, nums2, n2-cutlen) else: return self.findMedian_logn(nums1, n1-cutlent, nums2[cutlen:], n2-cutlen)

leetcode接受的程式碼,比較暴力求解

class Solution:
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        total = len(nums1)+len(nums2)
        res_list=[]  
        while len(nums1) and len(nums2):  
            if nums1[0]<nums2[0]:  
                res_list.append(nums1.pop(0))  
            else:  
                res_list.append(nums2.pop(0))  
        if len(nums1):  
            res_list+=nums1  
        elif len(nums2):  
            res_list+=nums2         

        if total%2==0:
            return (res_list[total//2-1]+res_list[total//2])/2
        else:
            return res_list[total//2]