您的位置:首页 > 编程语言 > C语言/C++

【LeetCode算法练习(C语言)】Median of Two Sorted Arrays

2017-09-09 15:08 405 查看
题目:

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

链接:Median of Two Sorted Arrays

解法:非递归二分归并,时间 O(log (m+n))

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int cnt = (nums1Size + nums2Size) / 2 + 1;
int pos1 = -1, pos2 = -1, tot1 = nums1Size, tot2 = nums2Size;
double ans;
while (pos1 + pos2 + 2 < cnt) {
if (pos1 == tot1 - 1) {
if (pos1 + (tot2 + pos2) / 2 + 2 <= cnt) pos2 = (tot2 + pos2) / 2;
else tot2 = (tot2 + pos2) / 2;
} else if (pos2 == tot2 - 1) {
if (pos2 + (tot1 + pos1) / 2 + 2 <= cnt) pos1 = (tot1 + pos1) / 2;
else tot1 = (tot1 + pos1) / 2;
} else if (nums1[(tot1 + pos1) / 2] < nums2[(tot2 + pos2) / 2]) {
if ((tot1 + pos1) / 2 + (tot2 + pos2) / 2 < cnt) pos1 = (tot1 + pos1) / 2;
else tot2 = (tot2 + pos2) / 2;
} else {
if ((tot1 + pos1) / 2 + (tot2 + pos2) / 2 < cnt) pos2 = (tot2 + pos2) / 2;
else tot1 = (tot1 + pos1) / 2;
}
}

if ((nums1Size + nums2Size) % 2) {
if (nums1[pos1] > nums2[pos2]) ans = (double)nums1[pos1];
else ans = (double)nums2[pos2];
} else {
if (nums1[pos1] > nums2[pos2]) {
if (pos1 >= 1 && nums1[pos1 - 1] > nums2[pos2]) ans = ((double)nums1[pos1] + (double)nums1[pos1 - 1]) / 2;
else ans = ((double)nums1[pos1] + (double)nums2[pos2]) / 2;
} else {
if (pos2 >= 1 && nums2[pos2 - 1] > nums1[pos1]) ans = ((double)nums2[pos2] + (double)nums2[pos2 - 1]) / 2;
else ans = ((double)nums1[pos1] + (double)nums2[pos2]) / 2;
}
}
return ans;
}


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