4 Median of Two Sorted Arrays

来源:互联网 发布:自动交易软件diy 编辑:程序博客网 时间:2024/06/05 17:42
class Solution:
    # @param {integer[]} nums1
    # @param {integer[]} nums2
    # @return {float}
    def findMedianSortedArrays(self, num1, num2):
        """
        "time complexity O(m+n)"
        nums=nums1+nums2
        nums.sort()
        l=len(nums)
        mid=(l-1)>>1
        if l%==2:
            return (nums[mid]+nums[mid+1])/2.0
        else:
            return nums[mid]
        """
        "what if time complexity is required to be O(log(m+n))??"
        #what about merge manner for getting the kth element from sorted arrays?
        """
        create a pointer pointing to each array's head respectively, if num1's current element<num2's, pointer1++, m++, and vice versa, while if k is close to m+n, the time complexity would be O(m+n)
        """
        #may binary thought help?
        
        l=len(num1)+len(num2)
        if l&1:
            return self.findk(num1,num2,(l+1)/2)
        else: 
            return (self.findk(num1,num2,l/2)+self.findk(num1,num2,l/2+1))/2.0
    
    def findk(self, num1, num2, k):
        l1,l2,ka,kb=len(num1),len(num2),min(k/2,len(num1)),k-min(k/2,len(num1))
        if l1>l2:   return self.findk(num2,num1,k)
        if l1==0:   return num2[k-1]
        if k==1:    return min(num1[0],num2[0])
        
        if num1[ka-1]<num2[kb-1]:
            return self.findk(num1[ka:],num2,k-ka)
        elif num1[ka-1]>num2[kb-1]:
            return self.findk(num1,num2[kb:],k-kb)
        else:
            return num1[ka-1]
        
        


        

0 0