題目
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)).
Example 1:
nums1 = [1, 3] nums2 = [2] The median is 2.0
Example 2:
nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5分析
找到兩個有序數組的中位數,利用尋找兩個有序數組中的第k個數和二分思想進行查找,每次比較可以拋棄一半長度的數組。
class Solution {
public:
double find(vector<int>& nums1, vector<int>& nums2,int nums1_beg,int nums1_end,int nums2_beg,int nums2_end,int k){//尋找兩個排序數組的第k個數
int nums1_mid=(nums1_beg+nums1_end)/2;//先計算得到各自的中間位置
int nums2_mid=(nums2_beg+nums2_end)/2;
if(nums1_beg>nums1_end)//如果nums1遍歷完,返回k在nums2中的下標位置
return nums2[nums2_beg+k-1];
if(nums2_beg>nums2_end)//反之返回在nums1中的下標位置
return nums1[nums1_beg+k-1];
if(nums1[nums1_mid]<=nums2[bmid]){//如果nums1的中間元素小於nums2的中間元素,根據k與二者前半部分元素個數進行判斷
if(k<=(nums1_mid-nums1_beg)+(nums2_mid-nums2_beg)+1){//k小於二者前半部分元素,則拋棄nums2的後半部分,繼續找k的位置
return find(nums1,nums2,nums1_beg,nums1_end,nums2_beg,nums2_mid-1,k);
}
else{//如果大於二者前半部分的元素個數,則拋棄nums1的前半部分,並令k減去這部分的長度,繼續找k的位置
return find(nums1,nums2,nums1_mid+1,nums1_end,nums2_beg,nums2_end,k-(nums1_mid-nums1_beg)-1);
}
}
else{
if(k<=(nums2_mid-nums2_beg)+(nums1_mid-nums1_beg)+1){
return find(nums1,nums2,nums1_beg,nums1_mid-1,nums2_beg,nums2_end,k);
}
else{
return find(nums1,nums2,nums1_beg,nums1_end,nums2_mid+1,nums2_end,k-(nums2_mid-nums2_beg)-1);
}
}
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size(),m=nums2.size();
int k=(m+n+1)/2;//計算得出中位數是序列中的第k個數(從1開始算)
if((m+n)%2==0){//如果序列之和爲偶數,則是第k個數和第k+1個數的平均數
double l=find(nums1,nums2,0,n-1,0,m-1,k);
double r=find(nums1,nums2,0,n-1,0,m-1,k+1);
return (l+r)/2;
}
return find(nums1,nums2,0,n-1,0,m-1,k);
}
};
詳細分析參考如下:
在兩個有序的數組中找第N個數,二分查找 O(lgm+lgn)級
Share my O(log(min(m,n)) solution with explanation