1. 程式人生 > >Leetcode|【4】Median of Two Sorted Arrays

Leetcode|【4】Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

這題不簡單,通用的方法是寫出一個找到兩個陣列第K大的函式。這個拓展性更好!
這裡我設定K從0取值。第0大的就是兩個陣列最小的數。
如果兩陣列的元素和是偶數,那麼取最中間的兩個數的平均值。

找到第K大的數的分析:分別在a和b陣列中找出第k/2大的數(考慮a陣列長度小於等於b的長度,且可能小於k/2);
如果a[k/2]

int findKth(vector<int>& nums1,int s1,vector<int>& nums2,int s2,int k){//nums1的有效長度假設比較小。
        if(nums1.size()-s1>nums2.size()-s2) return findKth(nums2,s2,nums1,s1,k);
        if(nums1.size()-s1==0) return nums2[s2+k];
        if(k==0) return nums1[s1]<nums2[s2]?nums1[s1]:nums2[s2];
        int
p1=k/2<nums1.size()-s1-1?k/2:nums1.size()-s1-1;//防止nums1太短 int p2=k-p1-1; if(nums1[s1+p1]<nums2[s2+p2]) return findKth(nums1,s1+p1+1,nums2,s2,k-p1-1); else if(nums1[s1+p1]>nums2[s2+p2]) return findKth(nums1,s1,nums2,s2+p2+1,k-p2-1); else return nums1[s1+p1]; } double
findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int total=nums1.size()+nums2.size(); if(total&1){ return findKth(nums1,0,nums2,0,total/2); }else{ return ((double)findKth(nums1,0,nums2,0,total/2-1)+(double)findKth(nums1,0,nums2,0,total/2))/2; } }