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)).
You may assume nums1 and nums2 cannot be both empty.
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
找两个有序数组的中值。用二分法,假设第一个数组元素较少,数量为 ,二分 ,使得 为前半部分( 时前半部分为空),令两个数组总共的前半部分长度为 ,则对应到第二个数组的 ,即第二个数组中 是前半部分。应当满足的条件是(假设第一第二个数组分别为 ):
假如不符合的话就修改相应的二分边界,复杂度 见代码:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size(),n=nums2.size();
if(m>n){swap(m,n);swap(nums1,nums2);}
int l=0,r=m,hl=(n+m+1)/2,maxl,minr;
while(l<=r){
int i=(l+r)/2;
int j=hl-i;
if(i>0&&nums1[i-1]>nums2[j])r=i-1;
else if(i<m&&nums2[j-1]>nums1[i])l=i+1;
else{
if(i==0)maxl=nums2[j-1];
else if(j==0)maxl=nums1[i-1];
else maxl=max(nums1[i-1],nums2[j-1]);
if((n+m)%2==1)return maxl;
if(i==m)minr=nums2[j];
else if(j==n)minr=nums1[i];
else minr=min(nums1[i],nums2[j]);
return double(maxl+minr)/2;
}
}
return 0;
}
};