您的位置:首页 > 其它

LeetCode第4题--寻找两个有序数组的中位数

2019-03-25 23:41 295 查看

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2,请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。

示例:nums1 = [1, 3, 5] nums2 = [2,6,7,8,9]
则中位数是 4.0

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int num1Len = nums1.size();
int num2Len = nums2.size();
if(num1Len > num2Len)
{
return findMedianSortedArrays(nums2, nums1);   //保证第一个数组最短,以最短的数组为基准
}
int C1,C2,L1,L2,R1,R2,lo = 0,hi = 2 * num1Len;      //数组扩充为原来2倍,保证都是偶数组
//C表示第几组割接,L表示割接后的左元素,R表示割接后的右元素
while(lo <= hi)
{
C1 = (lo+hi)/2;
C2 = num1Len + num2Len - C1;
L1 = (C1 == 0 ? INT_MIN : nums1[(C1-1)/2]);
R1 = (C1 == 2*num1Len ? INT_MAX : nums1[C1/2]);
L2 = (C2 == 0 ? INT_MIN : nums2[(C2-1)/2]);
R2 = (C2 == 2*num2Len ? INT_MAX : nums2[C2/2]);
//成为中位数的条件是L1 < L2 && L2 < L1
if(L1 > R2)
{
hi = C1-1;  //二分搜索,注意是C1-1
}
else if(L2 > R1)
{
lo = C1+1;
}
else
break;
}
return ((max(L1, L2) + min(R1, R2)) / 2.0);
}

注意:这里寻找中位数,所以C1+C2=num1Len+num2Len寻找K位数的话,将C1+C2 = 2*K即可

[原文链接如下] (https://www.geek-share.com/detail/2671209803.html)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: