Leetcode|【4】Median of Two Sorted Arrays
阿新 • • 發佈:2018-11-14
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;
}
}