您的位置:首页 > 其它

004 - Median of Two Sorted Arrays

2015-11-10 20:59 330 查看

Median of Two Sorted Arrays

My Submissions

Question
Total Accepted:
72488
Total Submissions:
414372
Difficulty: Hard

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)).

 

两个已排好序的数组,找到它们的median,median的意思是中间值,比如一个已排好序的数组的中间那个数,如1 2 5 median为2 , 如1 2 3 5 median为(2 + 3)/ 2.0 = 2.5

难度在于时间复杂度要为log(m + n),如果采用归并排序,再查找,时间复杂度就不能满足,得用二分法查找

 

我的想法是:找到这两个中位数的位置,如果数组个数为奇数个,这两个数相同,如果为偶数个两个中位数位置差一

int *findmid(int *n1, int l1, int *n2, int l2, int midnum)函数 去n1数组里找第midnum个数,以n2数组为参考,如果找不到就肯定在n2数组里

用二分法查找,这里要特殊处理的是数字重复的情况,比如5 5 5 5 5,得到的是一个区间,

int *findaim(int *n, int l, int aim)
{
static int ret[2];
ret[0] = ret[1] = -1;
int left = 0, right = l - 1, mid;
while (left <= right) {
mid = (left + right) / 2;
if(n[mid] < aim)
left = mid + 1;
else
right = mid - 1;
}
ret[0] = left;
left = 0, right = l - 1, mid;
while (left <= right) {
mid = (left + right) / 2;
if (n[mid] > aim)
right = mid - 1;
else
left = mid + 1;
}
ret[1] = left;
return ret;
}

int *findmid(int *n1, int l1, int *n2, int l2, int midnum)
{
int left = 0, right = l1 - 1, mid;
while(left <= right) {
mid = (left + right) / 2;
int *n2loc = findaim(n2, l2, n1[mid]);
if ((mid + n2loc[0]) > midnum) {
right = mid - 1;
} else if((mid + n2loc[1]) < midnum) {
left = mid + 1;
} else {
return n1 + mid;
}
}
return NULL;
}

double findMedianSortedArrays(int* nums1, int l1, int* nums2, int l2)
{
if (!l1 && !l2) return 0.0;
int m1, m2;
int *p1, *p2;
m1 = (l1 + l2 - 1) / 2;
m2 = m1;
if ((l1 + l2) % 2 == 0)
m2 += 1;
p1 = findmid(nums1, l1, nums2, l2, m1);
if (!p1)
p1 = findmid(nums2, l2, nums1, l1, m1);

p2 = findmid(nums1, l1, nums2, l2, m2);
if (!p2)
p2 = findmid(nums2, l2, nums1, l1, m2);
return 1.0 * (*p1 + *p2) / 2;
}


 

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