Leetcode 4. Median of Two Sorted Arrays
https://leetcode.com/problems/median-of-two-sorted-arrays/
1 class Solution { 2 public: 3 #include<algorithm> 4 int get_kth_val(vector<int>& nums1, vector<int>& nums2,int l1,int l2,int k){ 5 6 int L1=nums1.size()-l1,L2=nums2.size()-l2; 7 if(L1>L2) return get_kth_val(nums2,nums1,l2,l1,k); 8 if(L1==0) return nums2[l2+k-1]; 9 if(k==1) return min(nums1[l1],nums2[l2]); 10 int ka=min(L1,k/2); 11 int kb=k-ka; 12 if(nums1[l1+ka-1] == nums2[l2+kb-1]) return nums1[l1+ka-1]; 13 if(nums1[l1+ka-1] > nums2[l2+kb-1]) return get_kth_val(nums1,nums2,l1,l2+kb,k-kb); 14 else return get_kth_val(nums1,nums2,l1+ka,l2,k-ka); 15 } 16 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { 17 int L1=nums1.size(),L2=nums2.size(); 18 /* 19 5->第3个和第3个 20 6->第3个和第4个 21 找到第(L1+L2+2)/2个和第(L1+L2+1)/2个 22 23 查找第k个元素: 24 条件:A,B,B为长数组 25 ka=min(Len(A),k/2),kb=k-ka 26 若A[ka]==B[kb],则A[ka]为所求值 27 若A[ka] >B[kb],说明比B[kb]小的个数一定小于kb-1+ka-1, 28 即B[0...kb]是可以舍去的,进而求B[kb+1,...],A[0,...]的第k-kb个值 29 若A[ka]<B[kb],同理,A[0...ka]是可以舍去的,求A[ka+1...],B[0,...]的第k-ka个值 30 31 每次至少舍去一半的k,或者整个A数组,若舍去整个数组,下一轮直接在B中索引第k-Len(A)个即可 32 33 */ 34 int a,b; 35 if((L1+L2) % 2) a = b = get_kth_val(nums1,nums2,0,0,(L1+L2+2)/2); 36 else a= get_kth_val(nums1,nums2,0,0,(L1+L2+2)/2),b=get_kth_val(nums1,nums2,0,0,(L1+L2+1)/2); 37 return (a+b)/2.0; 38 } 39 };
python版本
def find_k(nums1,nums2,k): if len(nums1)>len(nums2): return find_k(nums2,nums1,k) if len(nums1)==0: return nums2[k-1] if k==1: return min(nums1[0],nums2[0]) l1=min(k//2,len(nums1)) l2=k-l1 if nums2[l2-1]>nums1[l1-1]: return find_k(nums1[l1:],nums2,k-l1) else: return find_k(nums1,nums2[l2:],k-l2) class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: L1,L2=len(nums1),len(nums2) x,y=find_k(nums1,nums2,(L1+L2+1)//2),find_k(nums1,nums2,(L1+L2+2)//2) return (x+y)/2