Leetcode 4. Median of Two Sorted Arrays(python)

求两个有序列表nums1和num2中的第k个数(finK函数),用分治法

比如对于求中位数:

  nums1=[11,23,35,56,78]

  nums2=[8,15,19,21,30,41,70]

  nums1的中位数35>nums2的中位数21,则两个列表的中位数一定在[11,23,35]和[21,30,41,70]这两个列表中

class Solution(object):
    def findK(self,nums1,nums2,k):
        l1,l2=len(nums1),len(nums2)
        pa=min(k/2,len(nums1))
        pb=k-pa
        if l1>l2:
            return self.findK(nums2,nums1,k)
        if l1==0:
            return nums2[k-1];
        if k==1:
            return min(nums1[0],nums2[0])
        if nums1[pa-1]<nums2[pb-1]:
            return self.findK(nums1[pa:],nums2,k-pa);
        elif nums1[pa-1]>nums2[pb-1]:
            return self.findK(nums1,nums2[pb:],k-pb);
        else:
            return nums1[pa-1];
        
    def findMedianSortedArrays(self, nums1, nums2):
        n=len(nums1)+len(nums2)
        if 1&n:
            return self.findK(nums1,nums2,(n+1)/2)
        else:
            return (self.findK(nums1,nums2,n/2)+self.findK(nums1,nums2,n/2+1))/2.0
        

  

posted @ 2016-03-27 20:55  colors  阅读(198)  评论(0编辑  收藏  举报