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做查找。