lc 4. Median of Two Sorted Arrays

https://leetcode.com/problems/median-of-two-sorted-arrays/

给你两个排序后的list,求两者concat后的中位数。

思想很简单,方法很很很复杂!!!至少对我来说

就是先一般化一下,找到两个listA 和listB 合并后的第k大的数。

如果len(listA)+len(listB)的中间位置下标是m

举例来说:

1.如果k<m代表k位置的数偏向于左边

2.如果listA的中位数<listB的中位数,那么listA更偏向于左边

3.那么我们可以安全的删掉listA的左边部分,更新一下这个新的k为k=k-len(listA的左边)

上面的1和2两步会产生四个分支,挨个写一下就ok,当然我代码写的很丑~

a.我的边界条件偷懒了,当某一list的长度小于10之后,直接暴力做出来

b.太丑了

code:

class Solution:
    def findm(self,nums1,nums2,mth,s1=-1,e1=-1,s2=-1,e2=-1):
        if s1==-1:
            s1,e1,s2,e2=0,len(nums1),0,len(nums2)

        if e1-s1<10 or e2-s2<10:
            ans=sorted(nums1[s1:e1]+nums2[s2:e2])[mth]
            return ans
        m=(e1+e2-s1-s2-1)//2
        m1=(e1-s1-1)//2
        m2=(e2-s2-1)//2
        if mth<=m: # we need left ,so delete right part of the larger one
            if nums1[s1+m1]<=nums2[s2+m2]:
                ans=self.findm(nums1,nums2,mth,s1,e1,s2,s2+m2+1)
            else:
                ans=self.findm(nums1,nums2,mth,s1,s1+m1+1,s2,e2)
        else:
            if nums1[s1+m1]<=nums2[s2+m2]:
                ans=self.findm(nums1,nums2,mth-m1,s1+m1,e1,s2,e2)
            else:
                ans=self.findm(nums1,nums2,mth-m2,s1,e1,s2+m2,e2)
        return ans


    def findMedianSortedArrays(self, nums1, nums2):
        l=len(nums1)+len(nums2)
        if l%2==1:
            return self.findm(nums1,nums2,l//2)
        else:
            return (self.findm(nums1,nums2,l//2-1)+self.findm(nums1,nums2,l//2))/2

 更加通用的,但是稍微耗时一点的方法是每次二分选定一个a中数字,再去找b中的该数字,两者的索引和意味着该数字的综合位置排名,我们可以知道该数字是大了还是小了,然后继续针对a做二分。也就是说对a做二分,对b做查找。

posted @ 2019-01-16 14:07  Cloud.9  阅读(100)  评论(0编辑  收藏  举报